zoukankan      html  css  js  c++  java
  • requests的content与text导致lxml的解析问题

    title: requests的content与text导致lxml的解析问题
    date: 2015-04-29 22:49:31
    categories: 经验
    tags: [Python,lxml,etree]

    最近实习工作任务比较重,又在做数据挖掘的教学工作,同时还在做毕设,所以博客更新比较慢。不过最近肯定会有大动作。

    闲话毕,转正题。在制作新浪微博模拟登录的部分时,遇到了一些问题。

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

    selector = etree.HTML(html)
    

    遇到报错:

    selector = etree.HTML(html)
      File "lxml.etree.pyx", line 2953, in lxml.etree.HTML (srclxmllxml.etree.c:66734)
      File "parser.pxi", line 1780, in lxml.etree._parseMemoryDocument (srclxmllxml.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'))
    

    这样一个转化了。

    最近CentOS都声明放弃Python2了,编码问题确实浪费了很多时间,等空下来转Python3吧~

  • 相关阅读:
    python 操作ie登陆土豆网
    python网络编程学习笔记(3):socket网络服务器
    python趣味编程:借书方案(排列组合)
    扑克牌洗牌
    C#开发的两个原则的深入讨论(转)
    软件文档知多少?(转)
    反射点滴Common
    使用ASP.NET加密口令(转)
    asp.net 备份和恢复SQL SERVER 数据库
    编程规范程序员们都应该这样写代码(转)
  • 原文地址:https://www.cnblogs.com/xieqiankun/p/lxmloldbug.html
Copyright © 2011-2022 走看看