# xpath 高级用法
# 匹配当前节点下的所有: .//
. 表示当前
// 表示当前标签下的所有标签
注: 要配合使用
# 匹配某标签的属性值: /@属性名称
这里以 input 里的 value 值为例:
例:xpath (//input/@value)
# 匹配多个路径:|
在一个 xpath 中写的多个表达式用 | 分开, 每个表达式互不干扰。
例:xpath ("//tr [6]/td [2]/text () | //tr [7]/td [2]/text ()")
# 按属性匹配:@
获取所有 id="test" 的所有文本内容
xpath('//*[@id="test"]//text()')
# 匹配不包含某个属性的标签 not
多用于表格中匹配中不包含表头信息的数据
例:xpath ('//table/tr [not (@class="tbhead")]')
# 匹配包含多个属性的标签: and
匹配所有的 tr 中不包含 tbhead 属性 和包含 head 的 tr 标签
xpath('//table/tr[not(@class="tbhead") and @class="head"]')
# 匹配包含不同属性的名称相同的标签: or
匹配包含 class="speedbar" 或者 class="content-wrap" 的标签
例:xpath('//div [@class="speedbar" or @class="content-wrap"]')
# 将对象还原为字符串:etree.tostring()
将匹配到的对象,作为 etree.tostring()的参数即可, 注: 返回字符串
sObj = xml.xpath ('//*[@id="test"]')[0] #使用 xpath 定位一个节点
sStr = etree.tostring(sObj)
# 按轴 (Axes) 匹配
# 选取当前节点的所有子元素: child
获取 div 下的 tr 的标签
例:xpath ('//div [@id="testid"]/child::tr/td/text ()') # 感觉这种方法鸡肋, //div [@id="testid"]//tr/td 也可以实现
# 选取当前节点的所有属性:attribute
获取 div 标签所有的属性值
例: xpath ('//div/attribute::') # 感觉这种方法鸡肋,//div/@ 同样能实现
# ancestor:父辈元素 /ancestor-or-self:父辈元素及当前元素
获取父辈元素的 div 的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用
xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')
# descendant:后代 /descendant-or-self:后代及当前节点本身
获取孩子元素的 div 的所有属性值,感觉鸡肋
xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')
# 选取当前节点的所有命名空间节点:namespace
xpath('//div[@id="test"]/namespace:😗')
# 定位:position
和通过下标定位一样, 方法鸡肋
xpath('//*[@id="test"]/ol/li[position()=2]/text()')
# Xpath 函数:
# 统计数量:count
统计符合要求节点的数量, 注: 返回字符串
xpath('count(//tr[@info])')
# 字符串拼接 :concat
统计出来的两个内容的字符串进行 “+” 处理, 注: 返回字符串
xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')
# 解析当前节点下的字符:string
string () 直解析匹配的第一个标签的值, 注: 返回字符串
xpath('string(//tr)')
element.xpath ('string (.)') #获取 element 下的所有文本
# 获取当前节点的节点名称: local-name
返回当前属性的节点名称, 注: 返回字符串
xpath('local-name(//*[@id="test"])')
# 以指定的字符开头:starts-with
starts-with 定位属性值以 8 开头的 li 元素
xpath('//tr[starts-with(@code,"one")]/text()')
# 小于:<
匹配所有 tr 标签属性 info 小于 200 的内容
xpath('//tr[@info<200]/text()')
# 查看元素是否存在:boolean
boolean(./td[1]/img)
# 根据指定的文本内容选择
# 相对定位,指定的文本内容可以是文本内容的部分, 也可以是全部
//div [2]/ul/li [contains (text (), "指定的文本内容")]/span/text ()
# 精准定位,目标文本和搜索文本完全一致
//div [2]/ul/li [text ()="指定的文本内容"]/span/text ()
# 通过文本内容定位兄弟标签的文本内容
//span [@class='tbtitem' and text ()=' 使用语言:']/following-sibling::text ()
// 定位【英语】 | |
<span class="tbtitem ys"> | |
页数: | |
</span> | |
3\r\n \r\n | |
<span class="tbtitem"> | |
使用语言: | |
</span> | |
英语 \r\n\t\t | |
<br> |
注: 以上内容, 除标注外, 均返回列表!!
# position:定位
选择偶数项:td [position ()=(position () mod 2 = 0)]
选择奇数项:td [position ()=(position () mod 2 != 0)]
driver.find_elements_by_xpath(f'//td[contains(text(),"核注清单")]/ancestor::tr/td[position()=(position() mod 2 != 0)]') |
# 查看元素的网页源码
a = html2.xpath('//table[@class="zebra"]')[1] | |
etree.tostring(a, encoding='utf-8').decode('utf-8') |