Python拥抱lxml

之前一直在用BeautifulSoup,怎么说呢,上手容易,但经常容易出现各种诡异的问题,却很难找到方法修改。

lxml.html是一个偏向底层的HTML解析器,速度秒杀BeautifulSoup。

网站:http://lxml.de/lxmlhtml.html

解析页面:

# 下载页面,转化编码
import urllib2
str = urllib2.urlopen("http://www.coder4.com").read().decode("utf-8")
# 解析lxml.html
ll = lxml.html.fromstring(str)
# 获取全部文本
print ll.text_content()
# 通过ID获取元素
elem = ll.get_element_by_id("top")
# 获取标签名 如 div
elem.tag
# 通过xpath返回所有的div
for tag in ll.findall('*div'):
    print tag.text_content()
# 遍历所有的a标签:
for tag in ll.iterdescendants('a'):
    print tag.tag
# 遍历一层,注意,只是之下一层!!
for tag in ll.iterchildren():
    print tag.tag
# 遍历所有文本部分,这个会保证全(递归到最底下)、且不重复。
# 和text_content()一个意思,只不过每块分开了。
for text in ll.itertext():
    print text

一些高级点的功能,清理,具体参数见文档http://lxml.de/api/lxml.html.clean.Cleaner-class.html:

# 清理HTML
from lxml.html.clean import Cleaner
cleaner = Cleaner(page_structure=False, links=False)
print cleaner.clean_html(html)

这个清理,默认会把page_structure=True,清理掉html、title等,所以使用时候要注意以下。

这个也很有用,提供一个base_url,将页面中所有url都转化为绝对(加上base_url)路径:

ll.make_links_absolute(self, base_url=None, resolve_base_href=True)

Leave a Reply

Your email address will not be published. Required fields are marked *