lxml是Python语言里和XML以及HTML工作的功能最丰富和最容易使用的库。lxml是为libxml2和libxslt库的一个Python化的绑定。它与众不同的地方是它兼顾了这些库的速度和功能完整性,以及纯Python API的简洁性,大部分与熟知的ElementTree API兼容但比之更优越。
安装lxml:
要求:需要Python2.3或更后的版本
使用easy_install工具,以超级用户或管理员的角色run下面的命令:
easy_install lxml
在windows下,最好指定版本号:easy_install lxml==2.2.6
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 独自等待
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.111com.net/')