python爬蟲之xpath和lxml解析內容
阿新 • • 發佈:2018-12-12
上兩章說了urllib和request庫如何訪問一個頁面或者介面,從而獲取資料,如果是訪問介面,還好說,畢竟返回的json還是很好解析的,他是結構化的,我們可以把它轉化成字典來解析,但是如果返回的是xml或者html,就有點麻煩了,今天就主要說一下如果解析這些html內容的工具:xpath和lxml。
xpath
xpath是一個可以在xml和html來查詢資訊的語言。語法如下
表示式 | 描述 | 示例 | 結果 |
---|---|---|---|
nodename | 選取該節點下的所有子節點 | article | 獲取article下的節點 |
/ | 如果是在最前面,代表從根節點選取。否則選擇某節點下的某個節點 | /article | 獲取article下節點的資訊 |
// | 從全域性節點中選擇節點,隨便在哪個位置 | //div | 找到所有的節點 |
@ | 選取某個節點的屬性 | //div[@class] | 選取所有div的class的屬性值 |
. | 選取當前節點 | ./a | 選取當錢節點下的a標籤 |
例如我們要獲取我們csdn部落格列表的內容,如下
//div[@class="article-list"]
//獲取某一篇文章的簡單資訊
//div[@class="article-list"]/div[2]
lxml
lxml 是 一個HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 資料。
lxml和正則一樣,也是用 C 實現的,是一款高效能的 Python HTML/XML 解析器,我們可以利用之前學習的XPath語法,來快速的定位特定元素以及節點資訊。
安裝lxml
pip install lxml
使用
我們開啟我的csnd部落格也列表,並且獲取介面上展示的資訊,例如截圖下的資訊
程式碼如下:
from lxml import etree
import requests
url = "https://blog.csdn.net/lovemenghaibin?t=1"
header = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
resp = requests.get(url, headers=header)
html = etree.HTML(resp.text)
blogs = html.xpath("//div[@class='article-list']/div[@class='article-item-box csdn-tracking-statistics']")
blogInfos = []
for first in blogs:
href_url = first.xpath("./h4/a/@href")[0]
content = first.xpath("./p[@class='content']/a/text()")[0]
createTime = first.xpath("//span[@class='date']/text()")[0]
readNumStr = first.xpath("//span[@class='read-num']/text()")[0]
readNum = readNumStr.replace("閱讀數:", "")
commentStr = first.xpath("//span[@class='read-num']/text()")[1]
commentCount = readNumStr.replace("評論數:", "")
blogInfo = {
"url": href_url,
"content": content,
"createTime": createTime,
"readNum": readNum,
"commentCount": commentCount
}
blogInfos.append(blogInfo)
print(blogInfos)
如果要獲取部落格的博主資訊,則程式碼如下:
from lxml import etree
import requests
url = "https://blog.csdn.net/lovemenghaibin?t=1"
header = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
resp = requests.get(url, headers=header)
html = etree.HTML(resp.text)
profile = html.xpath("//div[@id='asideProfile']")[0]
meUrl = profile.xpath("./div[1]/div[1]/a/@href")[0]
userName = profile.xpath("./div[1]/div[2]//a/text()")[0]
blogNum = profile.xpath("./div[2]/dl[1]/dd/a/span/text()")[0]
fans = profile.xpath("./div[2]/dl[2]/dd/span/text()")[0]
attentions = profile.xpath("./div[2]/dl[3]/dd/span/text()")[0]
comments = profile.xpath("./div[2]/dl[4]/dd/span/text()")[0]
blogLeve = profile.xpath("./div[3]/dl[1]/dd/a/@title")[0]
readCount = profile.xpath("./div[3]/dl[2]/dd/text()")[0].strip()
pointCount = profile.xpath("./div[3]/dl[3]/dd/text()")[0].strip()
rank = profile.xpath("./div[3]/dl[4]/dd/text()")[0]
profileInfo = {
"homeUrl": meUrl,
"userName": userName,
"blogNum": blogNum,
"fans": fans,
"attentions": attentions,
"comments": comments,
"blogLeve": blogLeve,
"readCount": readCount,
"pointCount": pointCount,
"rank": rank
}
print(profileInfo)
小結
本章介紹了xpath和lxml兩個工具,運用比較高效,速度快,學起來語法也比較簡單,我們可以直接根據類名查詢,也可以根據獲取屬性的值,例如獲取a標籤的href屬性,也可以獲取內部的文字,例如text()語法,查詢的話,類似於java解析xml的工具。當然操作xpath的時候一定要在瀏覽器上安裝xpath外掛。自己先寫一下。