scrapy response.text 乱码问题解决方案

scrapy response.text 乱码问题解决方案

这个网页很怪异,scrapy爬取到的楼栋名称是乱码,postman也是,而下载下来的页面却是正常显示。

通过postman将页面下载后,得到encoding='gbk' or 'gb2312' or 'gb18030'gb18030gb2312gbk 的超集,可以应付大部分中文编码),浏览器下载后的HTML中无meta标签。

通过scrapy shell调试,scrapy shell "http://www.czhome.com.cn/building.asp?ProjectID=1021&projectName=&PreSell_ID=9142&Start_ID=7094"

reponse.body,是bytes类型,直接decode,response.body.decode('gbk'),易得目标值正确。那怎么才能拿到decode后的str?

reponse.text,是str类型,直接输出目标值(楼栋名称)也是乱码,尝试decode,需要先encode,response.text.encode('utf-8').decode('gbk'),输出的目标值依旧不满足要求,即与web页面显示不一致。

其实response.text = response.body.decode(response.encoding)

reponse.encoding = 'cp1252',尝试修改encoding ,提示不提供修改,所以输出 response.body.decode('gbk')再进行xpath的路是不通咯。

了解 reponse对象,先来理解Response这个类

type(reponse) ='scrapy.http.response.html.HtmlResponse' HtmlResponse??百度之。。。找到这篇文章

Scrapy中的Reponse和它的子类(TextResponse、HtmlResponse、XmlResponse),说HtmlResponseTextResponse的子类,

so?TextResponse是?能不能重写这个类的某个方法?以达到修改encoding的目的?

理解Scrapy的Response的数据结构,

尝试将str转为TextResponse,然后只用xpath解析,MD,实在不行就直接借HTML了,那就浪费了好用的xpath

意外发现 可以这样,

response.text.encode('cp1252').decode('gbk')

那就可以这样输出了
response.xpath("//tr[@class='indextabletxt'][1]/td[1]/a/text()").get().encode(response.encoding).decode('gbk')

哈哈哈哈,其实就是解码get()后的str,就是解码response.text,意外实现了,其实早就应该发现的。

记录一下。

发布了85 篇原创文章 · 获赞 27 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/qq_22038327/article/details/101778560