第67天 PyQuery 詳解

2022-01-29 17:24:55 字數 3776 閱讀 5023

by 閒歡

跟安裝其他庫一樣:

>>> pip3 install pyquery
安裝了之後,在程式裡面就可以引用了,引用方法跟其他庫類似:

from pyquery import pyquery as pq
pyquery 可以將 html 字串初始化為物件,也可以將 html 檔案初始化為物件,甚至可以將請求的響應初始化為物件。下面我們乙個個來介紹。

對於乙個標準的 html 字串,pyquery 可以直接初始化為物件:

html = """

"""doc = pq(html)

print(type(doc))

print(doc)

# 輸出結果

我們可以看到,html 字串初始化後,列印出來的是乙個 pyquery 物件。

如果我們的字串不是 html 格式內容,pyquery 會自動加上段落標籤將字串內容包裝成 html 內容。例如:

test = '''

this is a string

this is second row

'''doc = pq(test)

print(type(doc))

print(doc)

# 輸出結果

this is a string

this is second row

初始化檔案,只需要加個 filename 引數,指明 檔案路徑即可:

#filename引數為html檔案路徑

test_html = pq(filename='test.html')

print(type(test_html))

print(test_html)

# 輸出結果

如果檔案不是 html 檔案,那麼初始化的時候會自動加上 html 標籤。例如:

#filename引數為html檔案路徑

test_txt = pq(filename='test.txt')

print(type(test_txt))

print(test_txt)

# 輸出結果

this is a txt

我的 test.txt 檔案中只有一行內容: this is a txt。初始化完後,自動新增了 html 標籤。

response = pq(url='')

print(type(response))

print(response)

# 輸出結果

"""pseudo_doc = pq(html)

#找到含有python的li標籤

print(pseudo_doc("li:contains('五星')"))

#找到含有好的li標籤

print(pseudo_doc("li:contains('紅')"))

#找到含有啊的li標籤

print(pseudo_doc("li:contains('啊')"))

# 輸出結果

五星啊紅旗

五星啊迎風飄揚啊

我們可以看到,如果查詢的結果有多條記錄,那麼結果會將多條記錄拼在一起。當然,如果查詢的內容不存在,就會返回空。

我們可以按照條件在 pyquery 物件中查詢符合條件的標籤,類似於 beautifulsoup 中的 find 方法。

例如,我要查詢 id 為 container 的標籤:

#列印id為container的標籤

print(doc.find('#container'))

# 輸出結果

我要查詢 id 為 container 的標籤的子標籤,使用 children 方法就可以實現:

#列印id為container的標籤的子標籤

container = doc.find('#container')

print(container.children())

# 輸出結果

五星啊紅旗

迎風飄揚啊

查詢父標籤,我們可以用 parent 方法:

#列印id為container的標籤的父標籤

container = doc.find('#container')

print(container.parent())

# 輸出結果

查詢兄弟標籤,我們用 siblings 方法:

#列印class為li2的標籤的兄弟標籤

li2 = doc.find('.li2')

print(li2.siblings())

# 輸出結果

五星啊迎風飄揚啊

前面我們講的都是怎麼定位到標籤,這只是我們解析資料的第一步,接下來我們需要從標籤中提取我們需要的資訊。

如果你需要提取標籤的屬性值,可以用 .attr() 方法,例如:

#獲取li2的class屬性值

print(doc('.li2').attr('class'))

# 輸出結果

li2

如果你細腰提取標籤內的文字,我們可以用 .text() 方法,例如:

#獲取li2的文字

print(doc('.li2').text())

# 輸出結果

紅旗

如果要獲取某個標籤下面的所有文字(包含子標籤的),怎麼做?我們來看下個例子:

#獲取html標籤下面的所有文字

print(doc('html').text())

# 輸出結果

我愛我的祖國

china

五星啊紅旗

迎風飄揚啊

很簡單,我們只需要找到這個標籤,使用 .text() 方法。

如果我們要獲取某個標籤下面的所有文字,但是要排除某些標籤的文字,該怎麼做?我們來看下個例子:

#排除部分標籤文字

tag = doc('html')

tag.remove('title')

print(tag.text())

# 輸出結果

我愛我的祖國

五星啊紅旗

迎風飄揚啊

我們可以用 .remove() 來刪除某些標籤,上面例子中可以看到,我們把 title 標籤去掉了,title 標籤對應的內容 china 也就去掉了。

前面我們介紹了 pyquery 可以獲取**請求的 html 內容,並轉化為物件。我們在請求 url 時,或許會遇到需要附帶一些引數的情況,這些自定義的引數在 pyquery 請求時也是支援的,例如 cookies 和 headers,我們看例子:

cookies = 

response = pq(url='',headers=headers,cookies=cookies)

print(response)

#返回(省略)

...

文中示例**:python-100-days-day067

第67天 物件導向的宣告 封裝

有兩種宣告物件的方式.1 var obj new object 但是我們更提倡用第二種方法 字面量式宣告物件 2 var obj 1 doctype html 2 html lang en 3 head 4 meta charset utf 8 5 title title title 6head 7...

Python學習第67天(css中float屬性)

今天的學習場景很獨特,為了能早點回家看到兩位寶寶,特地到廣州坐飛機,所以在機場中學習真的還是不錯的,下面就說一下今天的核心內容float,因為太累了,看的內容較少。先來了解一下block元素和inline元素在文件流中的排列方式。block元素通常被現實為獨立的一塊,獨佔一行,多個block元素會各...

第19天 AWK詳解

awk是一種處理文字檔案的語言,是乙個強大的文字分析工具。舉例 1.所在路徑 root centos7 ll which awk lrwxrwxrwx.1 root root 4 may 10 13 05 usr bin awk gawk 2.基本用法 awk etc fstab 1指的是第幾列。舉...