Python爬虫框架Scrapy如何爬取网页中style="display:none"隐藏标签的内容
如题,scrapy 新手请教,如何爬取网页元素显示样式设置为不可见(即 style=“display:none”)标签下的内容:
网页源码如下:
<dl class=“xxx” style=“display:none”>
<li>
<span class=“fl”>text1</span>
<p class=“fl”>text11</p>
</li>
<li>
<span class=“fl”>text2</span>
<p class=“fl”>text22</p>
</li>
</dl>
请教如何操作?谢谢!
Python爬虫框架Scrapy如何爬取网页中style="display:none"隐藏标签的内容
7 回复
元素 display:none 会导致 xpath 选不到吗?
Scrapy默认就能爬取display:none的内容,因为HTML源码里这些标签是存在的。主要问题在于如何提取这些隐藏数据。
核心方法:
- 直接解析HTML源码 - 隐藏内容在
response.text里都能找到 - 使用XPath或CSS选择器 - 和普通标签一样提取
- 注意动态加载 - 有些内容可能是JS动态生成的
代码示例:
import scrapy
class HiddenContentSpider(scrapy.Spider):
name = 'hidden_spider'
start_urls = ['http://example.com']
def parse(self, response):
# 方法1: 使用CSS选择器
hidden_divs = response.css('div[style*="display:none"]')
for div in hidden_divs:
# 获取文本内容
text = div.css('::text').get()
# 或者获取整个HTML
html = div.get()
# 方法2: 使用XPath
hidden_elements = response.xpath('//div[contains(@style, "display:none")]')
for elem in hidden_elements:
# 提取属性
data_id = elem.xpath('@data-id').get()
# 提取文本(包括子节点)
full_text = elem.xpath('string(.)').get()
# 方法3: 处理更复杂的隐藏方式
all_hidden = response.xpath('''
//*[contains(@style, "display:none") or
contains(@style, "visibility:hidden") or
contains(@class, "hidden")]
''')
yield {
'hidden_count': len(all_hidden),
'hidden_texts': [elem.xpath('string(.)').get() for elem in all_hidden]
}
关键点:
display:none只是CSS样式,不影响HTML源码解析- 用
contains()匹配部分样式字符串,因为可能有display: none; color: red这种情况 string(.)可以获取元素及其所有子元素的完整文本
如果数据是JS动态生成的:
# 可能需要查看网络请求或使用Splash
# 检查是否有API接口直接返回数据
import json
def parse(self, response):
# 查找可能包含数据的script标签
scripts = response.xpath('//script[contains(., "display:none")]/text()').getall()
for script in scripts:
# 尝试从JS代码中提取数据
if 'var hiddenData' in script:
# 用正则或其他方法提取
pass
一句话建议:直接解析HTML源码,隐藏内容都在里面。
不可见,源码里还是有的,有什么影响吗?
一样可以 xpath 取到的
不可见样式是指浏览器渲染方式不让人眼见,然而你爬虫取到的是网页的字符串。
有什么区别吗?
scrapy shell ,元素 display:none 会导致 xpath 选不到。

