pyquery库的使用

pyquery库的使用pyquery的强大之处就在于它有强大的CSS选择器,要初始化一个pyquery对象,首先需要传入一个HTML文本,它的初始化方式有多种,比如传入字符串、URL、文件名等。字符串初始化:我们先来看一个例子:frompyqueryimportPyQueryaspq#引入PyQuery对象html=”’<divclass="global-nav-items"&…

大家好,又见面了,我是你们的朋友全栈君。

pyquery的强大之处就在于它有强大的CSS选择器,要初始化一个pyquery对象,首先需要传入一个HTML文本,它的初始化方式有多种,比如传入字符串、URL、文件名等。

字符串初始化:

我们先来看一个例子:

from pyquery import PyQuery as pq#引入PyQuery对象
html = '''
<div class="global-nav-items">
  <ul>
    <li class="on">
      <a href="https://www.douban.com"  data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
    <li class="">
      <a href="https://movie.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-movie&quot;,&quot;uid&quot;:&quot;0&quot;}">电影</a>
    </li>
    <li class="">
      <a href="https://music.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-music&quot;,&quot;uid&quot;:&quot;0&quot;}">音乐</a>
    </li>
    <li class="">
      <a href="https://www.douban.com/location" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-location&quot;,&quot;uid&quot;:&quot;0&quot;}">同城</a>
    </li>
    <li class="">
      <a href="https://www.douban.com/group" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-group&quot;,&quot;uid&quot;:&quot;0&quot;}">小组</a>
    </li>
    <li class="">
      <a href="https://read.douban.com&#47;?dcs=top-nav&amp;dcm=douban" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-read&quot;,&quot;uid&quot;:&quot;0&quot;}">阅读</a>
    </li>
    <li class="">
      <a href="https://douban.fm&#47;?from_=shire_top_nav" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-fm&quot;,&quot;uid&quot;:&quot;0&quot;}">FM</a>
    </li>
  </ul>
</div>
'''
doc = pq(html)
print(doc('li'))#将初始化好的对象传入CSS选择器获取li标签
<li class="on">
      <a href="https://www.douban.com"  data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
    <li class="">
      <a href="https://movie.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-movie&quot;,&quot;uid&quot;:&quot;0&quot;}">电影</a>
    </li>
    <li class="">
      <a href="https://music.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-music&quot;,&quot;uid&quot;:&quot;0&quot;}">音乐</a>
    </li>
    <li class="">
      <a href="https://www.douban.com/location" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-location&quot;,&quot;uid&quot;:&quot;0&quot;}">同城</a>
    </li>
    <li class="">
      <a href="https://www.douban.com/group" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-group&quot;,&quot;uid&quot;:&quot;0&quot;}">小组</a>
    </li>
    <li class="">
      <a href="https://read.douban.com&#47;?dcs=top-nav&amp;dcm=douban" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-read&quot;,&quot;uid&quot;:&quot;0&quot;}">阅读</a>
    </li>
    <li class="">
      <a href="https://douban.fm&#47;?from_=shire_top_nav" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-fm&quot;,&quot;uid&quot;:&quot;0&quot;}">FM</a>
    </li>

URL初始化:

当初始化的参数为URL时,需要指定参数为url:

from pyquery import PyQuery as pq
doc = pq(url='https://movie.douban.com/cinema/nowplaying/chengdu/')
print(doc('title'))
<title>
    成都 - 在线购票&amp;影讯
</title>

PyQuery对象会首先请求这个url,然后用得到的html内容完成初始化,这相当于用网页的源代码以字符串的形式传递给PyQuery类来初始化,下面的写法也是相同的:

from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('https://movie.douban.com/cinema/nowplaying/chengdu/').text)
print(doc('title'))

除了传递url以外,还可以传递本地的文件名,只需要将参数指定为filename即可:

from pyquery import PyQuery as pq
doc = pq(filename='rr.html')
print(doc('img'))

当然文件必须时html文件,这样的话会先读取本地的文件内容,然后将文件内容以字符串的形式传递给PyQuery类来初始化。

CSS选择器

先来看一个例子:

from pyquery import PyQuery as pq#引入PyQuery对象
html = '''
<div id="items">
  <ul class="list">
    <li class="on">
      <a href="https://www.douban.com"  data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  </ul>
</div>
'''
doc = pq(html)
print(doc('#items .list li'))
print(type(doc('#items .list li')))
<li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  
<class 'pyquery.pyquery.PyQuery'>

这里我们初始化了PyQuery对象以后传入一个CSS选择器:#items .list li它的意思是先选取id为items的节点,然后再选取其内部class为list的节点内部的所有li结点。

查找结点

使用find()方法,传入CSS选择器可以查找子节点:

from pyquery import PyQuery as pq#引入PyQuery对象
html = '''
<div id="items">
  <ul class="list">
    <li class="on">
      <a href="https://www.douban.com"  data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  </ul>
</div>
'''
doc = pq(html)
items = doc('.list')
print(items)
print(type(items))
lis = items.find('li')
print(lis)
print(type(lis))
<ul class="list">
    <li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  </ul>

<class 'pyquery.pyquery.PyQuery'>
<li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  
<class 'pyquery.pyquery.PyQuery'>

这里首先选取class为list的节点,然后调用find()方法,传入css选择器,选取其内部的li节点,这时find()方法就会将所有符合条件的子节点选出来。find()方法会将所有符合条件的子孙节点找出来,如果要选则直接子节点就可以用children()方法:

from pyquery import PyQuery as pq#引入PyQuery对象
doc = pq(html)
items = doc('.list')
lis = items.children()
print(lis)
print(type(lis))
<li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  
<class 'pyquery.pyquery.PyQuery'>

如果要所有子节点中符合条件的节点,比如想筛选出子节点中class为on的节点可以向children()方法传入CSS选择器.on:

lis = items.children('.on')
print(lis)
<li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>

如果想要获取父节点可以用parents()方法:

from pyquery import PyQuery as pq#引入PyQuery对象
doc = pq(html)
items = doc('.list')
lis = items.parent()
print(lis)
print(type(lis))
<div id="items">
  <ul class="list">
    <li class="on">
      <a href="https://www.douban.com" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-main&quot;,&quot;uid&quot;:&quot;0&quot;}">豆瓣</a>
    </li>
    <li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>
  </ul>
</div>
<class 'pyquery.pyquery.PyQuery'>

这里的父节点时直接父节点,如果想要查找祖先节点可以用parents()方法。

如果想要筛选某个祖先节点的话可以用CSS选择器:

parent = items.parents('.wrap')

这里筛选出class为wrap的父节点。

使用siblings()方法可以筛选出兄弟节点:

items = doc('.list .on')
print(items.siblings())
<li class="">
      <a href="https://book.douban.com" target="_blank" data-moreurl-dict="{&quot;from&quot;:&quot;top-nav-click-book&quot;,&quot;uid&quot;:&quot;0&quot;}">读书</a>
    </li>

通过CSS选择器可以筛选出符合条件的兄弟节点:

print(items.siblings('.active'))

筛选出class为active的兄弟节点。

使用items()方法可以对其中的节点解析遍历:

lis = doc('li').items()
for li in lis:
    print(li)

解析网页的最终目的就是要提取其中的信息,下面分别来说一下如何来获取属性和文本:

attr()方法可以用来获取属性:
 

a = doc('.list .on a')
print(a.attr('href'))
https://www.douban.com

这里首先选中a标签,然后调用attr()方法获取href的属性值。

也可以调用attr的href属性:a.attr.href。

但要注意的是,当返回结果包含多个节点时attr()只会得到第一个节点的属性。但使用遍历就可以得到所有a节点的属性:

a = doc('a')
for item in a.items():
    print(item.attr('href'))

使用text()方法可以获取其中的文本:

a = doc('.list .on a')
print(a.text())
豆瓣

如果想要获取全部的html文本就可以使用html()方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140594.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月27日 下午6:00
下一篇 2022年5月27日 下午6:00


相关推荐

  • Fisher判别分析详解

    Fisher判别分析详解Fisher 判别分析将高维度空间的样本投影到低维空间上 使得投影后的样本数据在新的子空间上有最小的类内距离以及最大的类间距离 使得在该子空间上有最佳的可分离性可以看出右侧投影后具有更好的可分离性 Fisher 判别分析和 PCA 差别刚学完感觉两个很类似 实际上两个方法是从不同的角度来降维 PCA 是找到方差尽可能大的维度 使得信息尽可能都保存 不考虑样本的可分离性 不具备预测功能 LAD

    2026年3月17日
    2
  • OpenAI 开源模型 gpt-oss 本地部署详细教程

    OpenAI 开源模型 gpt-oss 本地部署详细教程

    2026年3月16日
    2
  • 最全面的外包公司的解释

    最全面的外包公司的解释1.最新北京软件外包公司排行榜软件外包企业排名:北京华盛恒辉科技有限公司(北京)北京五木恒润科技有限公司(北京)东软集团Neusoft(沈阳)博彦科技BeyondSoft(北京)海辉软件HiSoft(大连)文思VanceInfo(北京)浙大网新Insigma(杭州)奥博杰天Objectiva(北京)浪潮Inspur(济南)软通动力iSoftStone(北京)2.国内一些比…

    2022年5月29日
    51
  • 我竟然不再抗拒 Java 的类加载机制了

    我竟然不再抗拒 Java 的类加载机制了很长一段时间里,我对Java的类加载机制都非常的抗拒,因为我觉得太难理解了。但为了成为一名优秀的Java工程师,我决定硬着头皮研究一下。01、字节码在聊Java类加载机制之前,需要先了解一下Java字节码,因为它和类加载机制息息相关。计算机只认识0和1,所以任何语言编写的程序都需要编译成机器码才能被计算机理解,然后执行,Java也不例外。Java在诞生的时候喊出了…

    2022年5月10日
    37
  • linux 共享文件夹设置

    linux 共享文件夹设置linux 共享文件夹设置安装 samba 因为本人电脑上安装 yum 不成功 所以用自带的 apt 来安装 sambasudoapt getinstallsa 修改配置文件 vim etc samba smb conf 在文件后面输入 按 i 进入输入模式 输入完成之后 esc 推出输入模式 再输入 wq 保存文件并退出 share path PATH 此处为要共享的文件夹位置 browseable yes 文件夹是否可见 wr

    2026年3月18日
    1
  • 怎样在pycharm中安装torch

    怎样在pycharm中安装torch1.方法一:首先尝试如下办法Pytorch安装及使用(Pycharm版)_OTip的博客-CSDN博客_pycharm安装pytorch2.方法二:其次尝试第二种办法windows中在pycharm中安装pytorch_垃圾就应该待在垃圾桶里的博客-CSDN博客_pycharm怎么安装pytorch3.方法三:最后尝试第三种方法torch包在pycharm里面的导入问题_木槿的世界-CSDN博客…

    2022年8月26日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号