PySpider中查找提取元素

PySpider中内置的用于查找和定位html网页中元素的库是:PyQuery

PyQuery算是一个css选择器,模拟JS领域的jQuery,所以叫做PyQuery

具体细节是,PySpider针对html的响应response,默认提供了一个doc属性,其内置了PyQuery解析后结果,所以你可以用response.doc("your_css_selector")去选择你要的html中的内容了。

而具体的your_css_selector的写法,则就变成PyQuery的写法了。

举例:提取汽车之家车型车系相关数据

下面通过想象的例子来解释,PyQuery的常见用法:

比如想要提取:

<ul class="rank-list-ul" 0="">
  <li id="s3170">
...
    <div>
      ...
      <a id="atk_3170" href="//car.autohome.com.cn/pic/series/3170.html#pvareaid=103448">图库</a>
    ...
    </div>
  </li>
...
</ul>

中的href的值

  • 语言描述可以是:classrank-list-ulul元素,下面的li,下面的div,下面的a,且href值是包含/pic/series

  • 转换成PyQuery的语法是

    • .rank-list-ul li div a[href*="/pic/series"]
      • 也可以换成另外的写法:
        • ul[class='rank-list-ul'] li div a[href*="/pic/series"]
        • ul[class='rank-list-ul'] a[href*="/pic/series"]
          • 如果你确定此规则不会误匹配其他元素,也可以省略中间的节点的查找
  • 对应PySpider的代码是:

    • 获取匹配到的第一个元素
        firstMatchADoc = response.doc('.rank-list-ul li div a[href*="/pic/series"]')
      
    • 获取到所有匹配到的元素
        for eachADoc in response.doc('.rank-list-ul li div a[href*="/pic/series"]').items():
          print("eachADoc=%s" % eachADoc)
      

以及对于:

<dl id="33" olr="6">
  <dt><a href="//car.autohome.com.cn/price/brand-33.html#pvareaid=2042362"><img width="50" height="50"
        src="//car2.autoimg.cn/cardfs/series/g26/M0B/AE/B3/100x100_f40_autohomecar__wKgHEVs9u5WAV441AAAKdxZGE4U148.png"></a>
    <div><a href="//car.autohome.com.cn/price/brand-33.html#pvareaid=2042362">奥迪</a></div>
  </dt>
  <dd>

    <div class="h3-tit"><a href="//car.autohome.com.cn/price/brand-33-9.html#pvareaid=2042363">一汽-大众奥迪</a></div>
    <ul class="rank-list-ul" 0>

      <li id="s3170">
        <h4><a href="//www.autohome.com.cn/3170/#levelsource=000000000_0&pvareaid=101594">奥迪A3</a></h4>
        <div>指导价:<a class="red" href="//www.autohome.com.cn/3170/price.html#pvareaid=101446">19.32-23.46万</a></div>
        <div><a href="//car.autohome.com.cn/price/series-3170.html#pvareaid=103446">报价</a> <a id="atk_3170"
            href="//car.autohome.com.cn/pic/series/3170.html#pvareaid=103448">图库</a> <a data-value="3170"
            class="js-che168link" href="//www.che168.com/china/series3170/">二手车</a> <a
            href="//club.autohome.com.cn/bbs/forum-c-3170-1.html#pvareaid=103447">论坛</a> <a
            href="//k.autohome.com.cn/3170/#pvareaid=103459">口碑</a></div>

      </li>

      <li id="s692">
        <h4><a href="//www.autohome.com.cn/692/#levelsource=000000000_0&pvareaid=101594">奥迪A4L</a></h4>
        <div>指导价:<a class="red" href="//www.autohome.com.cn/692/price.html#pvareaid=101446">30.58-39.68万</a></div>
        <div><a href="//car.autohome.com.cn/price/series-692.html#pvareaid=103446">报价</a> <a id="atk_692"
            href="//car.autohome.com.cn/pic/series/692.html#pvareaid=103448">图库</a> <a data-value="692"
            class="js-che168link" href="//www.che168.com/china/series692/">二手车</a> <a
            href="//club.autohome.com.cn/bbs/forum-c-692-1.html#pvareaid=103447">论坛</a> <a
            href="//k.autohome.com.cn/692/#pvareaid=103459">口碑</a></div>

      </li>
...
...
...

对应的代码是:

想要从

<a href="//car.autohome.com.cn/price/brand-33.html#pvareaid=2042362"><img width="50" height="50" src="//car2.autoimg.cn/cardfs/series/g26/M0B/AE/B3/100x100_f40_autohomecar__wKgHEVs9u5WAV441AAAKdxZGE4U148.png"></a>

获取brand的logo的img的代码:

brandDoc = response.doc('dl dt')
brandLogoDoc = brandDoc.find('a img')
brandLogoUrl = brandLogoDoc.attr["src"]

从:

<div><a href="//car.autohome.com.cn/price/brand-33.html#pvareaid=2042362">奥迪</a></div>

中获取brand的name的a的代码:

brandNameDoc = brandDoc.find('div a')
brandName = brandNameDoc.text()

从:

<div class="h3-tit"><a href="//car.autohome.com.cn/price/brand-33-9.html#pvareaid=2042363">一汽-大众奥迪</a></div>

获取merchant的所有的a的代码:

merchantDocGenerator = response.doc("dd div[class='h3-tit'] a").items()
merchantDocList = list(merchantDocGenerator)
merchantDocLen = len(merchantDocList)

注意:.items()返回的是generator,想要得到list,需要用list(yourGenerator)去转换得到

从:

<ul class="rank-list-ul" 0>
...

获取rank-list-ulclassdd下面的ul的merchant的代码:

merchantRankDocGenerator = response.doc("dd ul[class='rank-list-ul']")
merchantRankDocList = list(merchantRankDocGenerator)
merchantRankDocListLen = len(merchantRankDocList)

以及获取每个元素:

  • 属性值:用attr
    • 类型是:dict
  • 字符串值:用text()
    • 类型是:str

举例:

for curIdx, merchantItem  in enumerate(merchantDocList):
    merchantName = merchantItem.text()
    merchantItemAttr = merchantItem.attr
    merchantUrl = merchantItemAttr["href"]

PyQuery资料

response.doc返回后的PyQuery对象,之后可以继续用PyQuery去操作

此处列出PyQuery的一些典型的操作函数:

  • PyQuery.filter(selector)
  • PyQuery.find(selector)
  • PyQuery.items(selector=None)
  • PyQuery.siblings(selector=None)

另外,常见的一些属性来说:

  • PyQuery.text(value=<NoDefault>):当前节点的text文本值
  • PyQuery.html(value=<NoDefault>, **kwargs):当前节点的html值

详见:

results matching ""

    No results matching ""