解析html之lxml包,提取html的資料

2021-09-25 03:42:46 字數 2674 閱讀 7396

解析html之lxml包

1 lxml的安裝

安裝方式:pip install lxml

2 lxml的使用

2.1 lxml模組的入門使用

匯入lxml 的 etree 庫 (匯入沒有提示不代表不能用)

from lxml import etree

利用etree.html,將字串轉化為element物件,element物件具有xpath的方法,返回結果的列表,能夠接受bytes型別的資料和str型別的資料

html = etree.html(text)

ret_list = html.xpath(「xpath字串」)

把轉化後的element物件轉化為字串,返回bytes型別結果 etree.tostring(element)

假設我們現有如下的html字元換,嘗試對他進行操作

from lxml import etree text = '''

'''

html = etree.html(text)

print(type(html))

handeled_html_str = etree.tostring(html).decode()

print(handeled_html_str)

輸出為 可以發現,lxml確實能夠把確實的標籤補充完成,但是請注意lxml是人寫的,很多時候由於網頁不夠規範,或者是lxml的bug,即使參考url位址對應的響應去提取資料,任然獲取不到,這個時候我們需要使用etree.tostring的方法,觀察etree到底把html轉化成了什麼樣子,即根據轉化後的html字串去進行資料的提取。

2.2 lxml的深入練習

接下來我們繼續操作,假設每個class為item-1的li標籤是1條新聞資料,如何把這條新聞資料組成乙個字典

from lxml import etree

text = 『』』

『』』html = etree.html(text)

#獲取href的列表和title的列表

href_list = html.xpath("//li[@class=『item-1』]/a/@href")

title_list = html.xpath("//li[@class=『item-1』]/a/text()")

#組裝成字典

for href in href_list:

item = {}

item[「href」] = href

item[「title」] = title_list[href_list.index(href)]

print(item)

輸出為假設在某種情況下,某個新聞的href沒有,那麼會怎樣呢?

from lxml import etree

text = 『』』

『』』結果是資料的對應全部錯了,這不是我們想要的,接下來通過2.3小節的學習來解決這個問題

2.3 lxml模組的高階使用

前面我們取到屬性,或者是文字的時候,返回字串 但是如果我們取到的是乙個節點,返回什麼呢?

返回的是element物件,可以繼續使用xpath方法,對此我們可以在後面的資料提取過程中:先根據某個標籤進行分組,分組之後再進行資料的提取

示例如下:

from lxml import etree

text = 『』』

『』』html = etree.html(text)

li_list = html.xpath("//li[@class=『item-1』]")

print(li_list)

結果為:

[, , ]

可以發現結果是乙個element物件,這個物件能夠繼續使用xpath方法

先根據li標籤進行分組,之後再進行資料的提取

from lxml import etree

text = 『』』

『』』#根據li標籤進行分組

html = etree.html(text)

li_list = html.xpath("//li[@class=『item-1』]")

#在每一組中繼續進行資料的提取

for li in li_list:

item = {}

item[「href」] = li.xpath("./a/@href")[0] if len(li.xpath("./a/@href"))>0 else none

item[「title」] = li.xpath("./a/text()")[0] if len(li.xpath("./a/text()"))>0 else none

print(item)

結果是:

前面的**中,進行資料提取需要判斷,可能某些一面不存在資料的情況,對應的可以使用三元運算子來解決

以上提取資料的方式:先分組再提取,都會是我們進行資料的提取的主要方法

3 動手

用xpath來做乙個簡單的爬蟲,爬取某個貼吧裡的所有帖子,獲取每個帖子的標題,連線和帖子中

思路分析:

獲取所有的列表頁的資料即連線和標題

2.1. 確定url位址,確定程式停止的條件

2.2. 確定列表頁資料的位置

由於沒有js,可以直接從elements中進行資料的提取

獲取帖子中的所有資料

3.1 確定url位址

url詳情頁的規律和列表頁相似

3.2 確定資料的位置

HTML解析之五 lxml的XPath解析

coding utf8 beautifulsoup可以將lxml作為預設的解析器使用,lxml亦可以單獨使用 比較beautifulsoup和lxml 1 beaufulsoup基於dom,會在如整個文件,解析整個dom樹,比較消耗記憶體和時間 lxml是使用xpath技術查詢和處理html xml...

Python 之lxml解析模組

lxml 是 乙個html xml的解析器,主要的功能是如何解析和提取 html xml 資料。一 lxml示例 1 初步 使用 lxml 的 etree 庫 from lxml import etree text 利用etree.html,將字串解析為html文件 html etree.html ...

Python 之lxml解析庫

一 xpath常用規則 二 解析html檔案 from lxml import etree 讀取html檔案進行解析 defparse html file html etree.parse test.html parser etree.htmlparser print etree.tostring ...