zoukankan      html  css  js  c++  java
  • 《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>
  • 相关阅读:
    IoC容器设计
    乐观锁(Optimistic Lock)
    file,path,uri互相转换
    QGraphicsView的paintEvent双缓存绘画
    简单的串口通信程序控制光源
    Qt--QMdiArea和QMdiSubWindow的基本用法
    Qt--支持鼠标拖动来移动内容的QScrollArea视窗
    快速排序算法记录
    结构体在内存中的对齐规则
    求N个数的数组中第K大的数的值
  • 原文地址:https://www.cnblogs.com/chengchengaqin/p/9785885.html
Copyright © 2011-2022 走看看