HTML文档解析之Pyquery

一. 引入

最经在学习前端开发,学完jquery之后,突然想起来之前学过一个html文档解析库,类似于 jquery。是的没有错,它就是Pyquery。官方文档解释---->pyquery: a jquery-like library for python,一个类似于jquery的python库,如果你学过前端,都会接触到 jquery。这样一来,上手这个解析库就非常容易了。

二. 安装

pip install pyquery

三. 快速开始

首先,定义一个 html 字符串用做测试(接下来都用该字符串进行测试):

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">It's a good story</p>
<p>
<!--Hey, buddy. Want to buy a used parser?-->
</p>
"""


这里首先引入 PyQuery这个对象,并取别名为pq。然后定义一个html字符串,并将其作为参数传递给 PyQuery这个类,这样就成功完成了初始化。接下来,将初始化的对象传入CSS选择器。这这个实例中,我们传入了 p 节点,这样就可以获得所有的 p 节点。返回的对象的类型为:<class ‘pyquery.pyquery.PyQuery’>,我们可以接着对该对象进行相同的操作。

四. 查找节点

  • 通过 CSS选择器来查找节点:

    这里我们初始化 PyQuery对象之后,传入了一个 CSS选择器 .story #link1,它的意思是:选取 class为 p 的节点,然后在p节点下找 id为 link1的子孙节点,并打印输出,可以看到,我们成功的获得到想要的节点。并且,最后得到的对象类型依然是 PyQuery类型。

  • 使用 find()方法,查找子节点。此时传入的参数也是CSS选择器。


可以看出,doc(css选择器) 方法 与 doc.find(css选择器)方法之间并没有区别。其实这两种方法,查找的范围是节点的所有子孙节点,而如果我们只需要查找 子节点,使用 .children() 方法(具体例子,这里不详细写)

  • 父节点兄弟节点的获取:

父节点:(注意 将 parent 改成 parents() 可以获得祖宗节点

兄弟节点:(注意,并不向 parent()方法一样,这里只能获得到所有的兄弟节点,并不能只获得到 相邻的某一个兄弟节点)

五. 遍历节点

  • 我们发现,pyquery的选择结果可能是有多个节点,也有可能是单个节点,类型都是pyquery类型。并没有像 BeautifulSoup 那样的列表(关于 beautiful soup 可以参考我另一篇博客)

    对于单个节点来说,可以直接打印输出,也可以直接转化为字符串。
    但是对于多个节点来说,我们就需要遍历来获取了。例如,这里把每一个 p 节点进行遍历,调用的是 items() 方法:


可以发现,调用 Items()方法后,会拿到一个生成器。遍历一下,就可以逐个获得到 p 节点对象了,它的类型也是 PyQuery类型。每一个 p 节点还可以调用 上面所写的方法 再次进行选择,非常的灵活!

六. 获取信息

提取到节点之后,我们的最终目的当然是提取节点所包含的信息了。比较重要的信息有两种,一是 获取属性,二十获取文本,下面分别进行说明:

  • 获取属性

    提取到某个 PyQuery类型的节点后,可以调用 attr()方法来获取属性:

    这里首先选中 html中所有的 a 节点,返回的类型是 PyQuery,由于不是返回一个 节点,所以,对返回的内容,遍历,获得每一个a节点;使用 attr()方法。这个方法中传入属性名称,就可以得到这个属性值了。

    当然,还可以使用 i.attr.href 这样写,也是 Ok 的

    PS: 如果获得到多个节点,不加以遍历,直接使用 attr,只能获得到 第一个节点的属性。

  • 获得文本

    获取节点之后的另一主要操作就是获取其内部文本了,这时可以调用 text()方法实现:


    这里首先获得到一个 class = 'title’的 p 节点,然后调用 text() 方法,就可以获得其内部的文本信息。此时它会忽略掉节点内部包含的所有 HTML节点,只返回纯文字内容。

    这里同样有一个问题,如果我们选中的结果是多个节点, text() 方法会返回什么内容呢?我们用 实例来 看一下:

    由此可见,text()返回了所有 a 节点内部的纯文本,中间用空格分割开来,即返回的结果是一个字符串。

    PS:这里需要注意一下,如果结果是多个节点,并且想要每个节点的内部文本,使用 text()方法不需要遍历就可以获取,它将所有节点 获取文本后,合并成一个字符串。

  • 最后,关于更多 PyQuery的用法,请参看官方文档:官方文档


end…

Guess you like

Origin blog.csdn.net/weixin_42218582/article/details/98473416