You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy中HtmlResponse对象在parse方法外使用CSS selector无法取值如何解决

问题原因

  • 手动实例化HtmlResponse时仅传入了url参数,没有加载对应页面的真实HTML响应体,相当于一个空的响应对象,所以css选择器找不到任何元素
  • parse方法里的response是Scrapy框架完成网络请求后,自动填充了完整响应头、响应体等数据的对象,所以可以正常提取内容

正确实现代码

你要实现「先请求分类页拿所有分类链接,再爬每个分类页」的需求,直接重写Scrapy的start_requests方法即可,示例如下:

import scrapy


class SampleSpider(scrapy.Spider):
    name = 'sample'
    allowed_domains = ['sample.com']

    def start_requests(self):
        # 第一步先请求分类页
        yield scrapy.Request(
            url='https://sample.com/search',
            callback=self.parse_categories
        )

    def parse_categories(self, response):
        # 提取所有分类链接
        categories = response.css('.categories a::attr(href)').getall()
        # 遍历请求每个分类页,用parse方法处理
        for category in categories:
            yield scrapy.Request(
                url=response.urljoin(category), # 自动处理相对路径转绝对路径
                callback=self.parse
            )

    def parse(self, response, **kwargs):
        pages = response.css('h3')
        for page in pages:
            print(page.css('::text').get())

注意事项

  • 不要在类属性定义阶段做网络请求相关的操作,类属性在爬虫加载阶段就会执行,此时Scrapy的请求调度体系还没启动,无法完成正常的页面拉取逻辑
  • 提取到的分类链接如果是相对路径,必须用response.urljoin()转为绝对路径再发起请求,避免请求出错

内容的提问来源于stack exchange,提问作者Tio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:03:00