etree.html乱码,lxml 中文乱码解决 | CN-SEC 中文网

今天帮群友解决一个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.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值