資料提取之 lxml

2021-09-24 22:02:03 字數 3151 閱讀 7656

xpath資料提取時 :先分組 再提取

2.1 lxml模組入門

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

from lxml import etree
2.利用etree.html 將字串轉化為element物件,element物件具有xpath的方法,該方法返回結果為列表。() 中text能夠接收bytse型別的資料和str型別的資料

html = etree.html(text)

ret_list = html.xpath("xpath字串") # 返回列表

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

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

from lxml import etree

text =

''''''

# 利用etree.html,將html字串轉化為element物件,該物件具有xpath方法

html = etree.html(text)

print

(html)

# 把element物件轉化為字串

print

(etree.tostring(html)

.decode(

))

輸出:

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

2.2 html.xpath() 的使用

提取以下新聞的標題和鏈結 組成乙個字典

from lxml import etree

text =

""""""

html = etree.html(text)

# ret_list = html.xpath("//li[@class]/a/@href|//li[@class]/a/text()")

# print(ret_list)

key_list = html.xpath(

"//li[@class]/a/@href"

)print

(key_list)

value_list = html.xpath(

"//li[@class]/a//text()"

)print

(value_list)

"""將兩個字串 對應的組成乙個字典"""

dict1 =

for key in key_list:

# 這種方法不好 如果缺失乙個標題 所有資料都會亂套

dict1[key]

= value_list[key_list.index(key)

]print

(dict1)

輸出:

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']

['first item', 'second item', 'third item', 'fourth item', 'fifth item']

如果缺失一條資料,所有字典對應都會出錯,下邊來解決這個問題。

2.3 lxml模組的高階使用

text =

"""

"""html = etree.html(text)

ret = html.xpath(

"//li/a/@href"

)print

(ret)

# ['link2.html']

from lxml import etree

text =

""" first item

"""html = etree.html(text)

ret = html.xpath(

"//li"

)print

(ret)

# [, ]

text =

"""

"""html = etree.html(text)

ret = html.xpath(

"//div/a"

)print

(ret)

#

2.4 針對2.2缺陷的改進
from lxml import etree

text =

""""""

html = etree.html(text)

print

(html)

li_list = html.xpath(

"//li"

)print

(li_list)

dict1 =

dict()

for li in li_list:

dict1 =

dict()

# xpath 查詢不到不會報錯 會返回空列表 空列表取值會報錯 所以加個判斷

dict1[

"title"

]= li.xpath(

"./a//text()")[

0]iflen

(li.xpath(

"./a//text()"))

>

0else

none

dict1[

"href"

]= li.xpath(

"./a/@href")[

0]iflen

(li.xpath(

"./a/@href"))

>

0else

none

print

(dict1)

輸出:

[, , , , ]

資料提取之XPATH

2.資料提取 xpath語法和 lxml模組 xpath是一門在xml和html文件中查詢資訊的語言 原本設計適用於xml的,但xml和html兩者的語法極為相似,所以也可以使用html 谷歌瀏覽器下是xpath 火狐瀏覽器下是try xpath 360瀏覽器下也相容xpath,使用時需要開啟開發者...

資料提取之re

貪婪模式 匹配任意字元 非貪婪模式 以.開頭 以.結尾 轉義str hello ret re.match h str print ret.group 結果為h group 會輸出完成的匹配結果 group 1 會輸出完整匹配中 用第1個 括起來的字串 分組 使用 的方式 1 group 和group...

Linux文字資料提取之head,tail例項詳解

提取開頭或結尾數行 顯示標準輸入前n 條記錄,或者命令列檔案列表的每乙個的前n 條記錄 head n n file s head n file s awk fnr n file s sed e nq file s sed nq file s 例項 gz fieldyang test awk fnr ...