05-xpath爬虫数据解析
Xpaht數據解析
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
XPath 是 W3C XSLT 標準的主要元素,并且 XQuery 和 XPointer 都構建于 XPath 表達之上。
因此,對 XPath 的理解是很多高級 XML 應用的基礎。
xpath學習網址:https://www.w3school.com.cn/xpath/index.asp
XPath 開發工具
Chrome插件 XPath Helper
- 環境安裝
- pip install lxml
- 解析原理:html標簽是以樹狀的形式進行展示
- 1.實例化一個etree對象,且將待解析的頁面源碼數據加載到該對象中。
- 2.調用etree對象的xpath方法結合著不同的xpath表達式實現標簽的定位和數據提取
- 實例化etree對象
- etree.parse(‘filename’):將本地html文檔加載到該對象中
- etree.HTML(‘page_text’):網站獲取的頁面數據加載到該對象中
- 標簽定位:
- xpath 語法中,整個HTML文檔根節點用’/‘表示,如果我們想選擇的是根節點下面的html節點,則可以在搜索框輸入
如果輸入下面的表達式
/html/body/div這個表達式表示選擇html下面的body下面的div元素。
注意/有點像 CSS中的>, 表示直接子節點關系。
絕對路徑選擇
從根節點開始的,到某個節點,每層都依次寫下來,每層之間用 / 分隔的表達式,就是某元素的 絕對路徑
上面的xpath表達式/html/body/div,就是一個絕對路徑的xpath表達式, 等價于 css表達式 html>body>div
相對路徑選擇
有的時候,我們需要選擇網頁中某個元素, 不管它在什么位置 。
比如,選擇示例頁面的所有標簽名為 div的元素,如果使用css表達式,直接寫一個 div就行了。
那xpath怎么實現同樣的功能呢? xpath需要前面加// , 表示從當前節點往下尋找所有的后代元素,不管它在什么位置。
所以xpath表達式,應該這樣寫://div
//符號也可以繼續加在后面,比如,要選擇 所有的 div 元素里面的 所有的 p 元素 ,不管div 在什么位置,也不管p元素在div下面的什么位置,則可以這樣寫//div//p
如果,要選擇 所有的 div 元素里面的 直接子節點 p , xpath,就應該這樣寫了//div/p
如果使用CSS選擇器,則為 div > p
通配符
如果要選擇所有div節點的所有直接子節點,可以使用表達式 //div/*
星號*是一個通配符,對應任意節點名的元素,等價于CSS選擇器 div > *
根據屬性選擇
Xpath 可以根據屬性來選擇元素。
根據屬性來選擇元素 是通過 這種格式來的 [@屬性名=‘屬性值’]
注意:
屬性名注意前面有個@
屬性值一定要用引號, 可以是單引號,也可以是雙引號
根據id屬性選擇
選擇 id 為 west 的元素,可以這樣 //*[@id='west']
根據class屬性選擇
選擇所有 select 元素中 class為 single_choice 的元素,可以這樣 //select[@class='single_choice']
如果一個元素class 有多個,比如
<p id="beijing" class='capital huge-city'>北京 </p>如果要選 它, 對應的 xpath 就應該是//p[@class="capital huge-city"]
不能只寫一個屬性,像這樣//p[@class="capital"]則不行
根據其他屬性
同樣的道理,我們也可以利用其它的屬性選擇
比如選擇 具有multiple屬性的所有頁面元素 ,可以這樣//*[@multiple]
屬性值包含字符串
要選擇 style屬性值 包含 color 字符串的 頁面元素 ,可以這樣//*[contains(@style,'color')]
要選擇 style屬性值 以 color 字符串 開頭 的 頁面元素 ,可以這樣 //*[starts-with(@style,'color')]
要選擇 style屬性值 以 某個 字符串 結尾 的 頁面元素 ,大家可以推測是//*[ends-with(@style,'color')], 但是,很遺憾,這是xpath 2.0 的語法 ,目前瀏覽器都不支持
按次序選擇
xpath也可以根據次序選擇元素。 語法比css更簡潔,直接在方括號中使用數字表示次序
比如
某類型 第幾個 子元素
比如
要選擇 p類型第2個的子元素,就是//p[2]
注意,選擇的是 p類型第2個的子元素 , 不是 第2個子元素,并且是p類型 。
注意體會區別
再比如,要選取父元素為div 中的 p類型 第2個 子元素//div/p[2]
第幾個子元素
也可以選擇第2個子元素,不管是什么類型,采用通配符
比如 選擇父元素為div的第2個子元素,不管是什么類型//div/*[2]
某類型 倒數第幾個 子元素
當然也可以選取倒數第幾個子元素
比如:
選取p類型倒數第1個子元素//p[last()]
選取p類型倒數第2個子元素//p[last()-1]
選擇父元素為div中p類型倒數第3個子元素//div/p[last()-2]
范圍選擇
xpath還可以選擇子元素的次序范圍。
比如,
選取option類型第1到2個子元素//option[position()<=2]
或者
//option[position() < 3]選擇class屬性為multi_choice的前3個子元素
//*[@class='multi_choice']/*[position()<=3]選擇class屬性為multi_choice的后3個子元素
//*[@class='multi_choice']/*[position()>=last()-2]為什么不是 last()-3 呢? 因為
last() 本身代表最后一個元素
last()-1 本身代表倒數第2個元素
last()-2 本身代表倒數第3個元素
組選擇、父節點、兄弟節點
組選擇
css有組選擇,可以同時使用多個表達式,多個表達式選擇的結果都是要選擇的元素
css 組選擇,表達式之間用 逗號 隔開
xpath也有組選擇, 是用 豎線 隔開多個表達式
比如,要選所有的option元素 和所有的 h4 元素,可以使用
//option | //h4等同于CSS選擇器option , h4
再比如,要選所有的 class 為 single_choice 和 class 為 multi_choice 的元素,可以使用
//*[@class='single_choice'] | //*[@class='multi_choice']等同于CSS選擇器.single_choice , .multi_choice
選擇父節點
xpath可以選擇父節點, 這是css做不到的。
某個元素的父節點用/.. 表示
比如,要選擇 id 為 china 的節點的父節點,可以這樣寫 //*[@id='china']/..
當某個元素沒有特征可以直接選擇,但是它有子節點有特征, 就可以采用這種方法,先選擇子節點,再指定父節點。
還可以繼續找上層父節點,比如 //*[@id='china']/../../..
兄弟節點選擇
前面學過 css選擇器,要選擇某個節點的后續兄弟節點,用 波浪線
xpath也可以選擇 后續 兄弟節點,用這樣的語法 following-sibling::
比如,要選擇 class 為 single_choice 的元素的所有后續兄弟節點 //*[@class='single_choice']/following-sibling::*
等同于CSS選擇器 .single_choice ~ *
如果,要選擇后續節點中的div節點, 就應該這樣寫//*[@class='single_choice']/following-sibling::div
xpath還可以選擇 前面的 兄弟節點,用這樣的語法preceding-sibling::
比如,要選擇 class 為 single_choice 的元素的所有前面的兄弟節點//*[@class='single_choice']/preceding-sibling::*
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的05-xpath爬虫数据解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 04-正则解析+bs4基础爬虫
- 下一篇: 06-代理爬虫实战