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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章