Python爬虫框架Scrapy请求返回乱码,如何解决?

网址: http://www.hkexnews.hk/APP/SEHKAppMainIndex_c.htm linkList =response.xpath(u'//td[[@class](/user/class)="pming_black12 ms-rteTableOddCol-BlueTable_CHI"]/a/@href').extract()

scrapy 中我这样写匹配是空,原因返回的编码是乱码 但是我这样写 response.body.decode(encoding="utf-8").xpath( '//td[[@class](/user/class)="pming_black12 ms-rteTableOddCol-BlueTable_CHI"]/a/text()')

说字符串没有 xpath ,这个如何解决?求人指教?

xpath 没有问题,因为我用 request 测试过

注:不能用正则 只能用 scrapy 内置的方法,谢谢


Python爬虫框架Scrapy请求返回乱码,如何解决?

3 回复

遇到Scrapy响应乱码,通常是因为响应头或HTML元标签的编码声明与实际内容编码不一致。Scrapy默认使用utf-8解码,如果网站使用其他编码(如gbkgb2312),就会乱码。

解决方案:

  1. 检查响应编码:在Spider的parse方法里打印response.encoding,看Scrapy自动检测的编码是什么。

  2. 手动指定编码

    • 如果知道网站编码(比如gbk),在请求里添加meta参数:
      yield scrapy.Request(url, meta={'encoding': 'gbk'})
      
    • 或者在回调函数里直接设置response.encoding = 'gbk'
  3. 使用response.body重新解码

    def parse(self, response):
        # 手动用gbk解码
        html_content = response.body.decode('gbk', errors='ignore')
        # 或者用chardet检测编码(需安装chardet库)
        # import chardet
        # detected_encoding = chardet.detect(response.body)['encoding']
        # html_content = response.body.decode(detected_encoding, errors='ignore')
    
  4. 修改DEFAULT_REQUEST_HEADERS(不推荐):有些网站根据请求头返回不同编码,但通常不如直接指定响应编码可靠。

示例代码:

import scrapy

class MySpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://example.com']

    def parse(self, response):
        # 方法1:直接设置响应编码
        response.encoding = 'gbk'
        title = response.css('title::text').get()
        
        # 方法2:手动解码body
        html_gbk = response.body.decode('gbk', errors='ignore')
        # 后续用Selectors解析html_gbk或直接处理字符串
        
        yield {'title': title}

总结:先确认网站编码,再手动指定解码方式。


from parsel import Selector
Selector(text).xpath(‘your_xpath’).extract()

回到顶部