《python3网络爬虫开发实战》--解析库的使用
Posted 成成啊亲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《python3网络爬虫开发实战》--解析库的使用相关的知识,希望对你有一定的参考价值。
在用正则表达式匹配的时候,错误一点点,可能会导致匹配失败所以还是不方便。
对于网页来说,它可以定义id,class或者其他属性,并且节点之间有层次关系,在网页可以通过XPath或CSS选择器来定位一个或者多个节点
1.XPATH
1 from lxml import etree 2 text = ‘‘‘ 3 <div> 4 <ul> 5 <li class="item-O"><a href="link1.html"><span>first item</span></a></li> 6 <li class="item-1"><a href="link2.html">second item</a></li> 7 <li class="item-inactive"><a href="link3.html">third item</a></li> 8 <li class="item-1"><a href="link4.html">fourth item</a></li> 9 <li class="item-O"><a href="link5.html">fifth item</a> 10 </ul> 11 </div> 12 ‘‘‘ 13 html = etree.HTML(text) 14 result = html.xpath(‘//li[1]/ancestor::*‘) 15 print(result) 16 result = html.xpath(‘//li[1]/ancestor::div‘) 17 print(result) 18 result = html.xpath(‘//li[1]/attribute::*‘) 19 print(result) 20 result = html.xpath(‘//li[1]/child::a[@href="link1.html"]‘) 21 print(result) 22 result = html.xpath(‘//li[1]/descendant::span‘) 23 print(result) 24 result = html.xpath(‘//li[1]/following::*[2]‘) 25 print(result) 26 result = html.xpath(‘//li[1]/following-sibling::*‘) 27 print(result)
1 [<Element html at 0x101070808>, <Element body at 0x101070788>, <Element div at 0x101070748>, <Element ul at 0x101070848>] 2 [<Element div at 0x101070748>] 3 [‘item-O‘] 4 [<Element a at 0x101070788>] 5 [<Element span at 0x101070848>] 6 [<Element a at 0x101070788>] 7 [<Element li at 0x101070848>, <Element li at 0x101070888>, <Element li at 0x1010708c8>, <Element li at 0x101070908>]
第一次选择时,调用了 ancestor轴,可以获取所有祖先节点。 其后需要跟两个冒号,然后是节点的选择器,这里直接使用*,表示匹配所有节点,因此返回结果是第一个 li节点的所有祖先节点,包括 html、 body、 div 和 ul。
第二次选择时,又加了限定条件,这次在冒号后面加了 div,这样得到的结果就只有 div 这个祖先节点了 。
第三次选择时,调用了 attribute轴,可以获取所有属性值,其后跟的选择器还是*,这代表获取节点的所有属性,返回值就是 li节点的所有属性值。
第四次选择时,调用了 child 轴,可以获取所有直接子节点 。 这里又加了限定条件,选取 href 属性为 linkl.html 的 a 节点 。
第五次选择时,调用了 descendant 轴,可以获取所有子孙节点。这里又加了限定条件获取 span节点,所以返回的结果只包含 span节点而不包含 a节点。
第六次选择 时,调用了 following 轴,可以获取当前节点之后的所有节点 。 这里虽然使用的是*匹配,但又加了索引选择,所以只获取了第二个后续节点 。
第七次选择时,调用了 following-sibling 轴 ,可以获取当前节点之后的所有同级节点 。 这里使用*匹配,所以获取了所有后续同级节点。
2. Beautiful Soup:
它借助网页的结构和属性等特性来 解析网页。 有了它,我们不用再去写一些复杂的正则表达式,只需要简单的几条语句,就可以完成网 页中某个元素 的提取 。
3. 使用pyquery
1 html = ‘‘‘ 2 <div id="container"> 3 <ul class="list"> 4 <li class="item-O">first item</li> 5 <li class="item-1"><a href="link2.html">second item</a></li> 6 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li> 7 <li class="item-1 active"><a href="link4.html">fourth item</a></li> 8 <li class="item-0"><a href="linkS.html">fifth item</a></li> 9 </ul> 10 </div> 11 ‘‘‘ 12 from pyquery import PyQuery as pq 13 doc = pq(html) 14 #doc = pq(‘https://cuiqingcai.com‘) 15 #print(doc(‘#container .list li‘)) 16 17 items = doc(‘.list‘) 18 lis = items.find(‘li‘)#子节点 19 items = doc(‘.list‘) 20 container = items.parent()#父节点 21 li = doc(‘.list .item-0.active‘) 22 print(li.siblings(‘.active‘)) 23 print(type(container)) 24 print(container)
1 <li class="item-1 active"><a href="link4.html">fourth item</a></li> 2 3 <class ‘pyquery.pyquery.PyQuery‘> 4 <div id="container"> 5 <ul class="list"> 6 <li class="item-O">first item</li> 7 <li class="item-1"><a href="link2.html">second item</a></li> 8 <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li> 9 <li class="item-1 active"><a href="link4.html">fourth item</a></li> 10 <li class="item-0"><a href="linkS.html">fifth item</a></li> 11 </ul> 12 </div>
以上是关于《python3网络爬虫开发实战》--解析库的使用的主要内容,如果未能解决你的问题,请参考以下文章
Python3网络爬虫实战-5Web库的安装:FlaskTornado
Python3网络爬虫实战-3数据库的安装:MySQLMongoDBRedis
[Python3网络爬虫开发实战] 1.3.1-lxml的安装