XPath解惑

什麼是XPath

就像上一篇咱們說的那樣——XPath 是一門在 XML 文檔中查找信息的語言;XPath 用於在 XML 文檔中經過元素和屬性進行導航

參考:https://www.cnblogs.com/scriptchild/p/10235180.html

官方一些就是:

XPath 使用路徑表達式在 XML 文檔中進行導航
XPath 包含一個標準函數庫
XPath 是 XSLT 中的主要元素
XPath 是一個 W3C 標準

 

借用一張圖html

 

如何使用XPath

XPath 是 XSLT 標準中的主要元素
在 XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、註釋以及文檔(根)節點
XML 文檔是被做爲節點樹來對待,樹的根被稱爲文檔節點或者根節點



#啥子Parent—Childre—Sibling 哦 ,我這所有曉不得
曉得是囊個意思就OK

搞懂語法曉得囊個用就OJBK

舉個使用XPath的爬蟲例子

#舉一個例子——豆瓣肖申克信息抓取

"""
語法:
1.// 雙斜槓 定位根節點,會對全文進行掃描,在文檔中選取全部符合條件的內容,以列表的形式返回。
2./ 單斜槓 尋找當前標籤路徑的下一層路徑標籤或者對當前路標籤內容進行操做 
3./text() 獲取當前路徑下的文本內容 
4./@xxxx 提取當前路徑下標籤的屬性值 
5.| 可選符 使用|可選取若干個路徑 如//p | //div 即在當前路徑下選取全部符合條件的p標籤和div標籤
6. . 點 用來選取當前節點 
七、 .. 雙點 選取當前節點的父節點 
"""
#在運用到python抓取時要先轉換爲xml #Import lxml #首先要先導入庫 #etree.HTML()#這個就是轉換爲xml的python的語法,HTML括號內填入目標站點的源碼

"""
截取:
//*[@id="content"]/h1/span[1]
//*[@id="info"]/span[1]/span[2]/a
//*[@id="info"]/span[3]/span[2]/span[1]/a
//*[@id="info"]/span[13]
"""
import requests from lxml import etree url = 'https://movie.douban.com/subject/1292052/' data = requests.get(url).text s = etree.HTML(data) # 在電影標題對應的代碼上依次點擊 右鍵 > Copy > Copy XPath,獲取電影名稱的Xpath: film = s.xpath('//*[@id="content"]/h1/span[1]/text()') #片名 director=s.xpath('//*[@id="info"]/span[1]/span[2]/a/text()') #導演 actor1=s.xpath('//*[@id="info"]/span[3]/span[2]/a[1]/text()') #主演1 actor2=s.xpath('//*[@id="info"]/span[3]/span[2]/a[2]/text()') #主演2 actor3=s.xpath('//*[@id="info"]/span[3]/span[2]/a[3]/text()') #主演3 time=s.xpath('//*[@id="info"]/span[13]/text()') #電影片長 # print(film,director,actor1,actor2,actor3,time) print('電影名稱:',film) print('導演:',director) print('主演::',actor1,actor2,actor3) print('電影片長:',time)

 XPath語法

XPath  使用路徑表達式在  XML  文檔中選取節點。節點是經過沿着路徑或者  step  來選取的。

路徑表達式:

表達式node

描述python

nodename函數

選取此節點的全部子節點。學習

/url

從根節點選取。spa

//code

從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。orm

.xml

選取當前節點。

..

選取當前節點的父節點。

@

選取屬性。

實例

在下面的表格中,咱們已列出了一些路徑表達式以及表達式的結果:

路徑表達式

結果

bookstore

選取 bookstore 元素的全部子節點。

/bookstore

選取根元素 bookstore

註釋:假如路徑起始於正斜槓( / ),則此路徑始終表明到某元素的絕對路徑!

bookstore/book

選取屬於 bookstore 的子元素的全部 book 元素。

//book

選取全部 book 子元素,而無論它們在文檔中的位置。

bookstore//book

選擇屬於 bookstore 元素的後代的全部 book 元素,而無論它們位於bookstore 之下的什麼位置。

//@lang

選取名爲 lang 的全部屬性。

謂語

謂語用來查找某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括號中。

實例

在下面的表格中,咱們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

路徑表達式

結果

/bookstore/book[1]

選取屬於 bookstore 子元素的第一個 book 元素。

/bookstore/book[last()]

選取屬於 bookstore 子元素的最後一個 book 元素。

/bookstore/book[last()-1]

選取屬於 bookstore 子元素的倒數第二個 book 元素。

/bookstore/book[position()<3]

選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。

//title[@lang]

選取全部擁有名爲 lang 的屬性的 title 元素。

//title[@lang='eng']

選取全部 title 元素,且這些元素擁有值爲 eng 的 lang 屬性。

/bookstore/book[price>35.00]

選取 bookstore 元素的全部 book 元素,且其中的 price 元素的值須大於 35.00

/bookstore/book[price>35.00]/title

選取 bookstore 元素中的 book 元素的全部 title 元素,且其中的 price 元素的值須大於 35.00

選取未知節點

XPath 通配符可用來選取未知的 XML 元素。

通配符

描述

*

匹配任何元素節點。

@*

匹配任何屬性節點。

node()

匹配任何類型的節點。

實例

在下面的表格中,咱們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式

結果

/bookstore/*

選取 bookstore 元素的全部子元素。

//*

選取文檔中的全部元素。

//title[@*]

選取全部帶有屬性的 title 元素。

 

再舉一個爬蟲例子做爲對比

#這裏是豆瓣Top250

from
lxml import etree import requests import time for a in range(10): url = 'https://book.douban.com/top250?start={}'.format(a*25) data = requests.get(url).text s=etree.HTML(data) file=s.xpath('//*[@id="content"]/div/div[1]/div/table') time.sleep(3) for div in file: title = div.xpath("./tr/td[2]/div[1]/a/@title")[0] href = div.xpath("./tr/td[2]/div[1]/a/@href")[0] score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0] num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip() scrible=div.xpath("./tr/td[2]/p[2]/span/text()") if len(scrible) > 0: print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0])) else: print("{},{},{},{}\n".format(title,href,score,num))

 

 總結

學習XPath就到這了,還有不少地方沒注意到,學無止境——加油!

HTML+JavaScript+CSS  ——正則   

正則是一個你們夥啊,讓我想一想怎麼去搞定他,可棘手啦。

 

補充

//元素標籤名[@屬性名='具體內容']
例如: //div[@class='box'],查找class爲box的div

//元素標籤名[第幾個]
例如: //div[@class='box'][2],查找符合條件的第2個div

//元素1/@屬性名
例如://ul/li/div/a/img/@src, 查找ul下的li下的div下的a下的img標籤的src屬性

//元素/text()
例如://a/text(), 獲取a標籤之間的文本(一級文本)

//元素//text()
例如://div[@class='box']//text(), 獲取class爲div下的全部文本

//元素[contains(@屬性名,'相關屬性值')]
例如://div[contains(@class,'zhangsan')] 查找class中包含zhangsan的div

//*[@屬性='']
例如://*[@name='lisi']查找全部name爲lisi的元素

 

 忽然看到就幾篇好文,在此推薦(哇,我也還在看吶,看了好幾遍了,很是Nice)

 

 

參考網址:http://www.cnblogs.com/qingchunjun/p/4208159.html

xpath詳解:http://www.cnblogs.com/ktgu/archive/2009/04/16/1353246.html  (╭(╯^╰)╮,早知道有那麼好的文章,我就直接XXOO了,哈哈)

相關文章
相關標籤/搜索