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源码里这些标签是存在的。主要问题在于如何提取这些隐藏数据。

核心方法:

  1. 直接解析HTML源码 - 隐藏内容在response.text里都能找到
  2. 使用XPath或CSS选择器 - 和普通标签一样提取
  3. 注意动态加载 - 有些内容可能是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 选不到。

回到顶部