为什么是Lxml
如果我想用Python获取网页中某个标签(
<div id=content>...</div>
),一般三种方式:正则、BS(Beautiful Soup)、Lxml。三种方式的优劣如何?分析见下表。
抓取方法 | 速度 | 使用难度 | 安装难度 |
---|---|---|---|
正则 | 快 | 困难 | 无(内置) |
BS | 慢 | 简单 | 简单 |
Lxml | 快 | 简单 | 一般 |
- 由于BS是由Python编写的模块,所以速度比较慢。而正则和Lxml都是用C实现的,所以速度较快。但是BS也可以将Lxml作为文本解析器,速度有一定提升。
- 经过测试,正则和Lxml的速度远比BS速度快,即使BS采用了Lxml作为解析器,速度仍然比前两者慢很多。
- 虽然正则速度最快,也不需要依赖,但实现起来也是比较复杂的,可读性也不高,所以在一般情况下更推荐Lxml。
安装Lxml
-
Windows平台下安装:
- 知乎上有提问。先升级pip:
pip install --upgrade pip
并安装wheel库:pip install wheel
。 - 然后在http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml这里下载和你操作系统和Python版本相匹配的wheel文件(下载后别改文件名)。
- 使用pip进行安装:
pip install X:\XX\lxml-3.6.4-cpxx-cpxxm-winxx.wheel
。
- 知乎上有提问。先升级pip:
-
Linux平台下安装:
- 可以参考我的这篇博客。
安装cssselect
- 安装好lxml库之后我们就能对网页代码进行结构组织。但这时我们还不能随心所欲的提取网页中的元素、标签等内容(好像有个xPath,但我不会,有兴趣的可以了解下。chrome的审查元素可以直接复制html标签的xPath,好像很方便的样子)。这个时候就需要一个专门进行提取内容的工具了,这个工具就是cssselect。
- 安装cssselect很简单,在Windows和Linux下都只需要一条命令就OK:
pip install cssselect
。
使用cssselect
- 首先安装 cssselect:
pip install cssselect
。 -
提取网页中的元素:
tree = lxml.html.fromstring(html) title = tree.cssselect('head title')[0].text # 获取网页标题 div = tree.cssselect('*') # 选择所有标签 div = tree.cssselect('div') # 选择所有div标签 div = tree.cssselect('div#content') # 选择id为content的div元素 div = tree.cssselect('div.content') # 选择class为content的div元素 div = tree.cssselect('tr#area > div') # 选择父元素为<tr id=area>标签的所有div子标签 div = tree.cssselect('tr#area div') # 选择<tr id=area>内部所有的div标签 input= tree.cssselect('input[value=name]') # 选择value属性为name的所有input标签 print(div[0].text) # 输出div中第一个标签的内容
其它
- 更多说明可以访问Lxml项目主页,比如html5解析器,xml解析器。