requests的content与text导致lxml的解析问题

使用requests获取了新浪微博的源代码,通过lxml库的etree.HTML来处理一段网页源代码,从而生成一个可以被xpath解析的对象。

selector = etree.HTML(html)

遇到报错:

selector = etree.HTML(html)
  File "lxml.etree.pyx", line 2953, in lxml.etree.HTML (src\lxml\lxml.etree.c:66734)
  File "parser.pxi", line 1780, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:101591)
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

根据报错信息推测,可能是因为不支持编码声明的Unicode字符串。Google发现这个问题在2012年就已经有人提交给作者了,但是一直没有被修复。地址在->https://gist.github.com/karlcow/3258330

不过下面的人也给出了解决办法:

html = bytes(bytearray(html, encoding='utf-8'))
selector = etree.HTML(html)

首先将源代码转化成比特数组,然后再将比特数组转化成一个比特对象。这样就可以绕过这个bug。

然而,又有人认为这不是一个bug, 所以一直没有被修复。这是由于,我获取源代码是使用r.text

html = requests.get('xxxxxx',cookies=cookies).text

而如果使用r.content:

html = requests.get('xxxxxx',cookies=cookies).content

就不会报错。

那r.text与r.content有什么区别呢?分析requests的源代码发现,r.text返回的是Unicode型的数据,而使用r.content返回的是bytes型的数据。也就是说,在使用r.content的时候,他已经只带了

html = bytes(bytearray(html, encoding='utf-8'))

这样一个转化了。


原文地址:http://www.unjeep.com/q/854550614.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值