xpath 高級用法
1. 匹配當前節(jié)點下的所有: .//
. 表示當前
// 表示當前標簽下的所有標簽
注: 要配合使用
2. 匹配某標簽的屬性值: /@屬性名稱
這里以input里的value值為例:
例:xpath(//input/@value)
3. 匹配多個路徑:|
在一個xpath中寫的多個表達式用 | 分開绞绒, 每個表達式互不干擾葬荷。
例:xpath("http://tr[6]/td[2]/text() | //tr[7]/td[2]/text()")
4.按屬性匹配:@
獲取所有id="test"的所有文本內(nèi)容
xpath('//*[@id="test"]//text()')
5. 匹配不包含某個屬性的標簽 not
多用于表格中匹配中不包含表頭信息的數(shù)據(jù)
例:xpath('//table/tr[not(@class="tbhead")]')
6. 匹配包含多個屬性的標簽: and
匹配所有的tr中不包含 tbhead 屬性 和包含 head 的tr標簽
xpath('//table/tr[not(@class="tbhead") and @class="head"]')
7. 匹配包含不同屬性的名稱相同的標簽: or
匹配包含class="speedbar" 或者 class="content-wrap" 的標簽
例:xpath('//div[@class="speedbar" or @class="content-wrap"]')
8. 將對象還原為字符串:etree.tostring()
將匹配到的對象渗柿,作為etree.tostring()的參數(shù)即可休吠, 注: 返回字符串
sObj = xml.xpath('//*[@id="test"]')[0] #使用xpath定位一個節(jié)點
sStr = etree.tostring(sObj)
9.按軸(Axes)匹配
9.1 選取當前節(jié)點的所有子元素: child
獲取div下的tr的標簽
例:xpath('//div[@id="testid"]/child::tr/td/text()') # 感覺這種方法雞肋属韧, //div[@id="testid"]//tr/td 也可以實現(xiàn)
9.2 選取當前節(jié)點的所有屬性:attribute
獲取div標簽所有的屬性值
例: xpath('//div/attribute::*') # 感覺這種方法雞肋法瑟,//div/@* 同樣能實現(xiàn)
9.3 ancestor:父輩元素 / ancestor-or-self:父輩元素及當前元素
獲取父輩元素的div的所有屬性值系瓢, 在不好定位的情況下绵患,通過孩子標簽定位,這種方法可以用
xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')
9.4 descendant:后代 / descendant-or-self:后代及當前節(jié)點本身
獲取孩子元素的div的所有屬性值账胧,感覺雞肋
xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')
9.5 選取當前節(jié)點的所有命名空間節(jié)點:namespace
xpath('//div[@id="test"]/namespace::*')
9.6 定位:position
和通過下標定位一樣竞慢, 方法雞肋
xpath('//*[@id="test"]/ol/li[position()=2]/text()')
10.Xpath 函數(shù):
10.1統(tǒng)計數(shù)量:count
統(tǒng)計符合要求節(jié)點的數(shù)量, 注: 返回字符串
xpath('count(//tr[@info])')
10.2字符串拼接 :concat
統(tǒng)計出來的兩個內(nèi)容的字符串進行“ + ”處理治泥, 注: 返回字符串
xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')
10.3 解析當前節(jié)點下的字符:string
string()直解析匹配的第一個標簽的值筹煮, 注: 返回字符串
xpath('string(//tr)')
10.4 獲取當前節(jié)點的節(jié)點名稱: local-name
返回當前屬性的節(jié)點名稱, 注: 返回字符串
xpath('local-name(//*[@id="test"])')
10.5 以指定的字符開頭:starts-with
starts-with定位屬性值以8開頭的li元素
xpath('//tr[starts-with(@code,"one")]/text()')
10.6 小于:<
匹配所有tr標簽屬性info小于200的內(nèi)容
xpath('//tr[@info<200]/text()')
11. 根據(jù)指定的文本內(nèi)容選擇
# 指定的文本內(nèi)容可以是文本內(nèi)容的部分居夹, 也可以是全部
//div[2]/ul/li[contains(text(), "指定的文本內(nèi)容")]/span/text()
注: 以上內(nèi)容败潦, 除標注外, 均返回列表W贾劫扒!
`總注: 在平常的xpath的使用中, 前8項的內(nèi)容已基本夠用狸膏, 使用時也應(yīng)該使用簡潔沟饥、易讀、高效的匹配式湾戳。其余兩項定位在較難的地方備選使用贤旷。切不可以為了追求高逼格, 刻意使用難懂難寫低效的匹配式砾脑。人生苦短...``