用Python的Lxml库抓取网页内容

为什么是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平台下安装:

    1. 知乎上有提问。先升级pip:pip install --upgrade pip 并安装wheel库:pip install wheel
    2. 然后在http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml这里下载和你操作系统和Python版本相匹配的wheel文件(下载后别改文件名)。
    3. 使用pip进行安装:pip install X:\XX\lxml-3.6.4-cpxx-cpxxm-winxx.wheel。 
       
  • 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解析器。

转载于:https://my.oschina.net/mickelfeng/blog/888407

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值