Scrapy NotSupported错误及meta传值为None问题排查与代码修正
问题解析与代码修正
问题1:scrapy.exceptions.NotSupported: Response content isn't text 错误
错误原因
- 手动构造
HtmlResponse的逻辑完全错误:scrapy.Request(press_release_url_2)只是生成了一个请求对象,并没有实际发送请求获取服务器响应,直接访问它的body属性得不到有效内容。 - 核心问题是
press_release_url_2指向的资源可能是二进制文件(比如PDF),并非文本/HTML格式,强行用HtmlResponse处理二进制内容就会触发该错误。
解决方式
删掉那段手动构造响应的冗余代码,Scrapy引擎会自动处理请求的发送与响应解析,无需手动创建HtmlResponse。
问题2:parse方法中press_release_url_2获取为None
错误原因
- 虽然在
get_pdf_url_2中给meta传入了值,但如果press_release_url_2本身是None(比如XPath未匹配到对应链接),传递过去的自然也是None。 - 之前写的手动构造响应代码完全是无用操作,既没有实际作用,还可能干扰正常请求流程。
解决方式
发起请求前先判断press_release_url_2是否为有效URL,确保只有拿到有效值时才发送请求,同时删除无效的手动响应构造代码。
修正后的完整代码
def parse(self, response): pdf_url = response.xpath( '//div[p[contains(text(), "The list becomes official upon ' 'publication in the Official Journal.")]]//a[@class="link-pdf"]/@href' ).get() press_release_url_2 = response.meta.get("press_release_url_2") print(press_release_url_2) # 保留后续原有代码 def get_pdf_url_2(self, response): press_release_url_2 = response.xpath( "//a[contains(@href, 'data.consilium.europa.eu/doc/document/')]/@href" ).get() # 先校验URL有效性,避免无效请求 if press_release_url_2: yield scrapy.Request( url=press_release_url_2, callback=self.parse, meta={"press_release_url_2": press_release_url_2}, )
内容的提问来源于stack exchange,提问作者lils
相关产品推荐
相关产品推荐

