《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网络爬虫学习——基本库的使用

Python3网络爬虫实战-3数据库的安装:MySQLMongoDBRedis

[Python3网络爬虫开发实战] 1.3.1-lxml的安装

[Python3网络爬虫开发实战] 1.3.3-pyquery的安装

Python3网络爬虫实战-6APP爬取相关库的安装:Charles的安装