xpath學(xué)習(xí)筆記
xpath簡(jiǎn)介
- xpath 用于在XML文檔中通過(guò)元素和屬性進(jìn)行導(dǎo)航
- xpath 使用路徑表達(dá)式來(lái)選取 XML 或 HTML 中的節(jié)點(diǎn)或者節(jié)點(diǎn)集搅吁。
xpath 節(jié)點(diǎn)
- 在 xpath 中 有七種類型的節(jié)點(diǎn):
- 元素
- 屬性
- 文本
- 命名空間
- 處理指令
- 注釋
- 文檔根節(jié)點(diǎn)
- 節(jié)點(diǎn)關(guān)系
- 父級(jí)
- 子級(jí)
- 同輩級(jí)
- 先輩級(jí)
- 后代級(jí)
xpath 語(yǔ)法
表達(dá)式 | 描述 | 語(yǔ)法示例 |
---|---|---|
nodename | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn),用戶選取標(biāo)簽名 | book |
/ | 從根節(jié)點(diǎn)選取 | /book |
// | 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn)汗洒,而不考慮他們的位置 | //price 選擇任意位置的 price 標(biāo)簽 |
. | 選取當(dāng)前節(jié)點(diǎn) | -- |
.. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) | -- |
@ | 選取屬性 | //@lang 選擇lang標(biāo)簽的所有屬性 |
[n] | 選取屬于某元素下的第n個(gè)子元素,索引從1開始 | /bookstore/book[2] |
[last()] | 選取屬于某個(gè)元素的最后一個(gè)元素 | /book[last()] last() 當(dāng)作函數(shù)理解 |
[last()-1] | 選取屬于某個(gè)元素的最后一個(gè)元素 | /book[last()-1] |
[position()] | 做元素定位使用 | /book[position()<3 選擇最前面兩個(gè)的book元素] |
[@lang] | 選擇有屬性為lang的元素 | //book[@lang] 選擇有l(wèi)ang屬性的book標(biāo)簽 |
[@class=""] | 選擇class屬性為某個(gè)值的元素 | //div[@class="item"] 選擇類名為item的div標(biāo)簽 |
* | 匹配任何元素節(jié)點(diǎn) | -- |
@* | 匹配任何屬性節(jié)點(diǎn) | -- |
| | 表示"或" | //bookstore/book/title|//bookstore/book/price 表示匹配文章中 bookstore 下 book 標(biāo)簽下的 title 或這 price 標(biāo)簽 |
語(yǔ)法示例:
from lxml import etree
html = '''
<bookstore>
<book price="100" category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="cn">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title category="web">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback" price="100">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
'''
# 將字符串轉(zhuǎn)為html對(duì)象
html = etree.HTML(html)
# 獲取bookstore下book標(biāo)簽的title標(biāo)簽
res = html.xpath('//bookstore/book/title')
print(res)
# 返回值(列表中是對(duì)象):[<Element title at 0x25c54df7388>, <Element title at 0x25c54df73c8>, <Element title at 0x25c54df7448>, <Element title at 0x25c54df7488>]
# 獲取bookstore下book標(biāo)簽的title標(biāo)簽中category屬性值為“web”
res = html.xpath('//bookstore/book/title[@category="web"]')
print(res)
# 返回值(列表中是對(duì)象):[<Element title at 0x1f0ec727388>]
# 獲取bookstore下book標(biāo)簽的title標(biāo)簽中category屬性值為“web”的標(biāo)簽的值
res = html.xpath('//bookstore/book/title[@category="web"]/text()')
print(res)
# 返回值(列表中是字符串):['XQuery Kick Start']
# 獲取bookstore下book的price屬性為100的標(biāo)簽下的title()標(biāo)簽的值
res = html.xpath('//bookstore/book[@price="100"]/title/text()')
print(res)
# 返回值(列表中的是字符串):['Everyday Italian', 'Learning XML']
# 獲取bookstore 下book下第1個(gè)標(biāo)簽的所有屬性 [1]:表示選擇第幾個(gè)標(biāo)簽 @*:表示選擇所有的屬性
res = html.xpath('//bookstore/book[1]/@*')
print(res)
# 返回值(列表中是字符串)
# 獲取bookstore 下book帶有任意屬性的標(biāo)簽
res = html.xpath('//bookstore/book[@*]')
print(res)
# 返回值 (列表中的是對(duì)象):[<Element book at 0x17a7fb47388>, <Element book at 0x17a7fb473c8>, <Element book at 0x17a7fb47448>, <Element book at 0x17a7fb47488>]
# 獲取帶有屬性的title元素的值
res = html.xpath('//title[@*]/text()')
print(res)
# 返回值(列表中的是字符串):['Everyday Italian', 'Harry Potter', 'XQuery Kick Start']
# 獲取book下的 title 和 price 標(biāo)簽
res = html.xpath('//book/title | //book/price')
print(res)
# 返回值:(列表中的是對(duì)象):[<Element title at 0x256dc8773c8>, <Element price at 0x256dc877448>, <Element title at 0x256dc877488>, <Element price at 0x256dc8774c8>, <Element title at 0x256dc877508>, <Element price at 0x256dc877548>, <Element title at 0x256dc877588>, <Element price at 0x256dc8775c8>]
# 獲取book有category或price屬性的值
res = html.xpath('//book/@category | //book/@price')
print(res)
# 返回值 (列表中的是字符串):['100', 'cooking', 'children', 'web', 'web', '100']
補(bǔ)充:
- items.xpath('.//div[starts-with(@class, "item")]')
表示div的 class 屬性以 item 開頭