今天帮群友解决一个lxml抓取所有文本时遇到的问题,lxml抓取中文会乱码,搜索一下,找到如下的解决方案,分享给大家。
1、要保证传给lxml的参数都是unicode
2、用 urlopen() 抓到的 file-like object ,或者用open()打开的硬盘上的 file object 不一定是unicode
3、用 unicode(file-like-object.read(),"utf-8") 能得到肯定是unicode的东西
4、这样处理之后再传给lxml的fromstring
5、xml.etree.ElementTree 也是一样
6、虽然lxml.html.parse()可以接受file-like object 作为参数,但是不要用,因为你传进去一个file-like object 你也不知道是不是unicode,万一有中文就会有乱码。
7、总是用unicode(file-like-object.read(),"utf-8") 这么转换对性能肯定是不好,但目前我也只会这种笨方法
应用到代码中如下,请大家参考:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Date: 2016/2/14 # Created by 独自等待 # 博客 http://www.waitalone.cn/ import urllib2 from lxml import etree from lxml.html.clean import Cleaner def getText(url): ''' 获取指定url返回页的所有文字 :param url: 需要抓取的url :return: 返回文字 ''' page = urllib2.urlopen(url, timeout=10).read() page = unicode(page, "utf-8") # 转换编码,否则会导致输出乱码 cleaner = Cleaner(style=True, scripts=True, page_structure=False, safe_attrs_only=False) # 清除掉CSS等 str = etree.HTML(cleaner.clean_html(page)) texts = str.xpath('//*/text()') # 获取所有文本 for t in texts: print t.strip().encode('gbk', 'ignore') getText('http://www.360.cn/')
参考文章:
from www.waitalone.cn.thanks for it.
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论