解析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 ...