Python爬蟲學習筆記4 解析庫的使用

2022-08-27 14:48:15 字數 3951 閱讀 1224

學習參考:python3網路爬蟲開發實戰

lxml、 beautiful soup、 pyquery

4.1 使用 xpath

//title[@lang='eng'] :它代表選擇所有名稱為 title,同時屬性 lang 的值為 eng 的節點 

from lxml import etree

html = etree.html() # 呼叫html類進行初始化

result = etree.tostring(html) # 輸出修正後的html**,結果為bytes型別

print(result.decode('utf-8')) # 轉bytes型別為str型別

text()可以獲取節點內部文字 ,用@符號獲取節點屬性

from lxml import etree

text = '''

first item

'''html = etree.html(text)

result = html.xpath('//li[@class="li"]/a/text()')

print(result)

li 節點的 class 屬性有兩個值 li 和 li-first,此時如果還想用之前的屬性民 配獲取,就無法匹配了。

result =html.xpath(』//li[l]/a/text()』) print(result)

result = html.xpath(』//li[last()]/a/text()』) print(result)

result = html.xpath(』//li[position()<3]ia/text()』) print (result)

result = html.xpath(』//li[last()-2]/a/text()』) print(result)

第一次選擇時,我們選取了第乙個 li 節點,中括號中傳入數字 l 即可 。 注意,這裡和**中不 同,序號是以 1開頭的,不是以 0開頭。

第二次選擇時,我們選取了最後乙個 li 節點,中括號中傳入 last()即可,返回的便是最後乙個 li節點。

第 三 次選擇時,我們選取了位置小於 3 的 li 節點,也就是位置序號為 l 和 2 的節點,得到的結果 就是前兩個 li節點。

第四次選擇時,我們選取了倒數第三個 li 節點,中括號中傳入 last()-2 即可 。 後乙個,所以 last()-2就是倒數第三個 

4.2 使用 beautiful soup

beaut1也lsoup 自動將輸入文件轉換為 unicode編碼,輸出文件轉換為 utf-8編碼。 你不 需妥考慮、編碼方式 ,除非文件沒有指 定乙個編碼方式,這時你僅僅需妥說明一下原始編碼方 式就可以了。

','lxml') #beaufulsoup物件的初始化 如果使用lxml為解析器,那麼第二引數用『lxml』,同理其他一樣

print(soup.p.string) # 讀取p節點,呼叫string得到裡面的文字
呼叫 prettify()方法。 這個方法可以把要解析的字串以標準的縮排格式輸出 。 這裡需要 注意的是,輸出結果裡面包含 body和 html節點,也就是說對於不標準的 html字串 beautifolsoup, 可以自動更正格式 。 這一步不是由 prettify()方法做的,而是在初始化 beautifol soup 時就完成了  。

呼叫soup.title.string,這實際上是輸出 html 中 title 節點的文字內容,所以,soup.title 可以選出 html 中的 title 節點,再呼叫 string 屬性就可以得到裡面的文字了。

呼叫 string 屬性來獲取文字的值 

呼叫 name屬性就可以得到節點名稱

呼叫 attrs 獲取所有屬性 ,或者直接在節點元素後面加中括號,傳入屬性名就可以獲取屬性值。

parent屬性,獲取某個節點的父節點

parents 獲取某個節點所有祖先節點,返回結果是生成器型別

next_siblings 和 previous_siblings 則分別返回所有前面和後面 的兄弟節點的生 成器 

find all,顧名思義,就是查詢所有符合條件的元素 。

attrs 除了根據節點名查詢,我們也可以傳入一些屬性來查詢 attrs 引數,引數的型別是字典型別 

text引數可用來匹配節點的文字 ,傳入的形式可以是字串,可以是正規表示式物件 

find()方法,只不過後者返回的是單個元素 ,也就是第乙個匹配的元 素 

find_parents()和find_parent(): 前者返回所有祖先節點, 後者返回直接父節點。

find_next_siblings()和find_next_sibling(): 前者返回後面所有的兄弟節點 , 後者返回後面

第乙個兄弟節點 

find_previous_siblings()和find_previous_sibling(): 前者返回前面所有的兄弟節點, 後者

返回前面第乙個兄弟節點 。 

find_all_next()和 find_next(): 前者返回節點後所有符合條件的節點,後者返回第乙個符合 條件的節點  

find_all_previous()和 find_previous():前者返回節點後所有符合條件的節點,後者返回第 乙個符合條件的節點 

7. css 選擇器 

使用 css選擇器時,只需要呼叫 select()方法,傳人相應的 css選擇器即可 .

print(soup.select(』ul li』)) 

select(』ul li')則是選擇所有 ul節點下面的所有 li節點,結果便是所有的 li節點組成的列表 

for ul in soup.select('ul'):

print(ul. select(' li')) 

select()方法同樣支援巢狀選擇。 例如,先選擇所有 ul節點,再遍歷每個 ul節點,選擇其 li節 

4.3 使用 pyquery

2. 初始化 

·字元 串初始化

from pyquery import pyquery as pq

doc = pq(html)

print(doc('li'))

•url 初始化 

from pyquery import pyquery as pq

doc = pq(url='')

print(doc('title'))

·檔案初始化

除了傳遞 url,還可以傳遞本地的檔名, 此時將引數指定為 幹ilename 即可  

3. 基本 css 選擇器 

from pyquery import pyquery as pq

doc = pq(html)

print(doc(』#container .list li』)) 

傳入了乙個 css選擇器#container .list li,它的意思是先 選取 id 為 container 的節點,然後再選取其內部的 class 為 list 的節點內部的所有 li 節點 。 

4. 查詢節點

·子節點 

find()方法會將符合條件的所有節點擊擇出來,結果的型別是 pyquery 型別 。

其實幹 ind()的查詢範圍是節點的所有子孫節點,而如果我們只想查詢子節點,那麼可以用 children()方法 

·獲取屬性

提取到節點之後,我們的最終目的當然是提取節點所包含的資訊了 。 比較重要的資訊有兩類, 一 是獲取屬』性,二是獲取文字

呼叫 attr()方法來獲取屬性

Python 爬蟲學習4

任務 爬取58頁面中的正常商品,每個商品詳情頁中的類目 標題 發帖時間 成色 區域 瀏覽量資訊 注意 多開反爬取 看是個人還是商家 url中的0和1 詳情頁中的標題 待改進,這是第二頁的,第一頁的每個詳情頁的鏈結爬不了 問題出在第一頁趴下來的關於詳情頁鏈結有問題,第一頁不同於後面頁,後面頁也有不同的...

python 爬蟲 4 資料解析 xpath

html中的結構可能是棵樹,不一定是二叉樹,可能是多叉的。這時用xpath定位,解析會比較合適。語法 1.解析本地儲存 tree etree.parse filename 2.解析網上爬取 tree etree.html page text 3.標籤定位 tree.xpath html head 定...

python爬蟲學習(十)bs4解析資料

lxml安裝是個坑 coding utf 8 import lxml import requests from bs4 import beautifulsoup if name main ua偽裝 將對應的user agent封裝到字典中 headers url 對指定url發起請求,對應的url是...