學習參考:python3網路爬蟲開發實戰
lxml、 beautiful soup、 pyquery
4.1 使用 xpath
//title[@lang='eng'] :它代表選擇所有名稱為 title,同時屬性 lang 的值為 eng 的節點
from lxml import etreetext()可以獲取節點內部文字 ,用@符號獲取節點屬性html = etree.html() # 呼叫html類進行初始化
result = etree.tostring(html) # 輸出修正後的html**,結果為bytes型別
print(result.decode('utf-8')) # 轉bytes型別為str型別
from lxml import etreeli 節點的 class 屬性有兩個值 li 和 li-first,此時如果還想用之前的屬性民 配獲取,就無法匹配了。text = '''
first item
'''html = etree.html(text)
result = html.xpath('//li[@class="li"]/a/text()')
print(result)
result =html.xpath(』//li[l]/a/text()』) print(result)第一次選擇時,我們選取了第乙個 li 節點,中括號中傳入數字 l 即可 。 注意,這裡和**中不 同,序號是以 1開頭的,不是以 0開頭。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 節點,中括號中傳入 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•url 初始化doc = pq(html)
print(doc('li'))
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是...