chengchengaqin

在用正则表达式匹配的时候,错误一点点,可能会导致匹配失败所以还是不方便。

对于网页来说,它可以定义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>

 

 

分类:

技术点:

相关文章: