python爬虫xpath提取数据_python爬虫三大解析库之XPath解析库通俗易懂详讲
@(這里寫自定義目錄標題)
使用XPath解析庫
1.簡介
??XPath(全稱XML Path Languang),即XML路徑語言,是一種在XML文檔中查找信息的語言。適用于XML和HTML文檔的搜索。
??優(yōu)點:提供了非常簡潔明了的路徑選擇表達式。還提供了超過100個內(nèi)建函數(shù),可以匹配大部分的節(jié)點。
??官網(wǎng):https://www.w3.org/TR/xpath/
??準備工作:需要安裝lxml庫。
2.常用規(guī)則
表達式
功能
nodename
選取此節(jié)點的所有子節(jié)點
/
從當前節(jié)點選取直接子節(jié)點
//
從當前節(jié)點選取直接子孫節(jié)點
.
選取當前節(jié)點
..
選取當前節(jié)點的父節(jié)點
@
選取屬性
3.etree模塊解析網(wǎng)頁簡介
??etree是lxml庫中的函數(shù),可以自動修正HTML文本。下面是兩種導入方法:
??直接讀取網(wǎng)頁代碼進行解析:
from lxml import etree
text = '''
HTML文本
'''
# 將HTML文本轉(zhuǎn)化為可以用etree解析的對象,
html = etree.HTML(text) # 結(jié)果是bytes類型,如果需要文本輸出,則需要用decode()轉(zhuǎn)碼為Unicode編碼
??讀取文本文件進行解析(這里既會自動修正文件,又會補充DOCTYPE聲明):
from lxml import etree
html = etree.parse('文本文件路徑/文本文件名字.html',etree.HTMLParse()) # 結(jié)果是bytes類型,如果需要文本輸出,則需要用decode()轉(zhuǎn)碼為Unicode編碼
??用tostring()方法即可輸出修正后的HTML代碼。
4.選取所有節(jié)點,子節(jié)點和父節(jié)點
(1)選取所有節(jié)點
??一般用//開頭的XPath規(guī)則,就會選擇從當前節(jié)點開始的所有子孫節(jié)點,也就是所有節(jié)點。所以要匹配所有的節(jié)點代碼如下:
a = html.xpath('//*') # 選取所有的節(jié)點
b = html.xpath('//a') # 選取所有的a節(jié)點,是一個例子
??這里的a和b,也就是xpath方法的返回值是一個列表,每個元素是Element類型,后面跟著節(jié)點的名稱,是一個可迭代對象。要取出某一個對象,就需要用處理列表的方法進行。
(2)選取子節(jié)點
??選取子節(jié)點只需要在后面加上/節(jié)點名稱(選擇直接子節(jié)點,也就是與其相鄰的第一個子節(jié)點),如果直接子節(jié)點沒有就會報錯,或者//節(jié)點名稱(選擇所有子孫節(jié)點),例子如下:
c = html.xpath('//li/a') # 選取li節(jié)點的直接a子節(jié)點
d = html.xpath('//li//a') # 選取li節(jié)點的所有a子節(jié)點
(3)選取父節(jié)點
??獲取某個節(jié)點的父節(jié)點有兩個方法,一個是用..,另一個是用parent::。
同理,如果沒有父節(jié)點,就會報錯,例子如下:
e = html.xpath('//li/../a') # 選取li節(jié)點的父節(jié)點下的a節(jié)點
f = html.xpath('//li/parent::/a') # 選取li節(jié)點的父節(jié)點下的直接a節(jié)點
g = html.xpath('//li/parent::*/a') # 選取li節(jié)點的父節(jié)點下的所有a節(jié)點
5.屬性匹配,文本獲取和屬性多值匹配
(1)屬性匹配
??在選取節(jié)點的時候,[email?protected],用[@屬性名="屬性值"]進行實現(xiàn),例子如下:
s = html.xpath('//li[@class="ming"]') # 選取屬性值class="ming"的所有l(wèi)i節(jié)點
??要注意的是里面的括號和外面的括號盡量一個用雙引號,一個用單引號。
(2)文本獲取
??我們用Xpath中的text()方法即可獲取節(jié)點中的文本。要注意的是獲取到的數(shù)據(jù)可能包括換行符‘\n‘。
(3)屬性多值匹配
??要是屬性有多個值的話,用上面的方法就無法匹配了。需要用到contains()函數(shù),包含兩個參數(shù),[email?protected],例子如下:
# 源代碼中為
s1 = html.xpath('//li[contains(@class,"ming1")]') # 選取屬性值class="ming1"的所有l(wèi)i節(jié)點
s2 = html.xpath('//li[contains(@class,"ming2")]') # 選取屬性值class="ming2"的所有l(wèi)i節(jié)點
6.屬性獲取和多屬性匹配
(1)屬性獲取
s = html.xpath('[email?protected]]') # 獲取所有l(wèi)i節(jié)點下的直接a子節(jié)點的href屬性
(2)多屬性匹配
??有時候需要根據(jù)多個屬性值確定一個節(jié)點,就需要同時匹配多個屬性。要用and進行連接,可以把contains(@屬性名,"屬性名")[email?protected]="屬性值"混合使用,例子如下:
# 選取所有屬性值class="a"和_target="ming"的li節(jié)點下的所有a節(jié)點的href屬性
two_s = html.xpath('//li[contains(@class,"a") and @_target="ming"][email?protected]')
7.按次序選擇
??有時候選擇到的某些屬性可能同時匹配了多個節(jié)點,但是要想得到其中的某一個節(jié)點,該如何獲取呢?可以用中括號傳入索引的方法獲取特定次序的節(jié)點。下面是一些常用方法的總結(jié):
方法
功能
[n]
選取第n個節(jié)點,序號是以1開頭的
[last()]
選取最后一個節(jié)點
[position() < n]
選取位置小于n的節(jié)點,這里可以用算術(shù)運算符進行選擇
[last() - n]
選取倒數(shù)第n+1個節(jié)點,由于last()是倒數(shù)第一個,則last() - n就是倒數(shù)第n+1個
8.節(jié)點軸選擇
??由于網(wǎng)頁代碼是一個DOM樹,因此可以用相對的位置進行選擇節(jié)點的子節(jié)點,兄弟節(jié)點,父節(jié)點或者祖先節(jié)點等。python的節(jié)點軸選擇常用的如下:
節(jié)點軸
選擇節(jié)點
ancestor:: *
獲取所有祖先節(jié)點
ancestor::條件
獲取指定條件的祖先節(jié)點
attribute:: *
獲取節(jié)點的所有屬性
attribute::屬性名
獲取節(jié)點的指定屬性
child:: *
獲取所有子節(jié)點
child::條件
獲取指定條件的子節(jié)點
descendent:: *
獲取所有的子孫節(jié)點
descendent::條件
獲取指定條件的子孫節(jié)點
following:: *
獲取當前節(jié)點之后的所有節(jié)點
following:: *[n]
獲取當前節(jié)點之后的第n個節(jié)點
following-sibing:: *
獲取當前節(jié)點之后的所有同級節(jié)點
following-sibing::條件
獲取當前節(jié)點之后指定條件的所有同級節(jié)點
9.開發(fā)者工具查看xpath選擇器路徑
??用F12打開開發(fā)者工具,按才Copy->Copy Xpath就可以把該段代碼的XPath路徑代碼復制下來,很方便。
原文:https://www.cnblogs.com/ITXiaoAng/p/11958605.html
總結(jié)
以上是生活随笔為你收集整理的python爬虫xpath提取数据_python爬虫三大解析库之XPath解析库通俗易懂详讲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何给智能路由器升级-如何升级路由器固件
- 下一篇: python采用那种编程模式_使用Mix