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请求返回乱码,如何解决?
遇到Scrapy响应乱码,通常是因为响应头或HTML元标签的编码声明与实际内容编码不一致。Scrapy默认使用utf-8解码,如果网站使用其他编码(如gbk、gb2312),就会乱码。
解决方案:
-
检查响应编码:在Spider的
parse方法里打印response.encoding,看Scrapy自动检测的编码是什么。 -
手动指定编码:
- 如果知道网站编码(比如
gbk),在请求里添加meta参数:yield scrapy.Request(url, meta={'encoding': 'gbk'}) - 或者在回调函数里直接设置
response.encoding = 'gbk'。
- 如果知道网站编码(比如
-
使用
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') -
修改
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()


