【爬虫】在 xpath路径中插入变量的正确姿势

本文介绍了一种使用XPath和Python循环来高效抓取网页列表的方法,通过动态改变XPath路径中的数字参数,实现对列表中多个元素的快速定位和数据抓取。
写在前面:

由于优快云的审查机制的原因,更多博客内容请访问我的个人博客或GitHub:

  1. 个人博客地址:个人博客
  2. GitHub地址:GitHub

举例说明

"""说明:要在列表a中分别插入三个内容,且这三个内容只有tbody[1]中的数字不同,分别为1, 2, 3"""
//源代码
a = []
a.insert(0, dom.xpath("//div[@class='listWraper']/table[2]/tbody[1]/tr[1]/td[1]/p[1]/text()"))
a.insert(1, dom.xpath("//div[@class='listWraper']/table[2]/tbody[2]/tr[1]/td[1]/p[1]/text()"))
a.insert(2, dom.xpath("//div[@class='listWraper']/table[2]/tbody[3]/tr[1]/td[1]/p[1]/text()"))
"""这里用循环来来实现三条内容的插入"""
a = []
for i in range(3):
	# 这里用{}.format(i)的方式来在xpath路径中插入变量
	a.insert(i, dom.xpath("//div[@class='listWraper']/table[2]/tbody[{}]/tr[1]/td[1]/p[1]/text()".format(i+1)))
XPath 表达式中使用变量的方式取决于执行环境和所使用的解析器。在 Python 的 `lxml` 库中,XPath 支持通过 `$` 符号引用外部变量,并在执行查询时传入变量值,从而实现参数化查询[^1]。例如,可以将变量嵌入到 XPath 表达式中,如 `//item[@type=$tag_name]`,然后通过字典形式提供变量值: ```python from lxml import etree tree = etree.parse("example.xml") vars = {"tag_name": "book"} result = tree.xpath("//item[@type=$tag_name]", **vars) ``` 在上述代码中,`**vars` 用于传递变量值,使得 XPath 表达式能够在运行时动态绑定变量值,从而提升代码的灵活性和复用性。 在 Selenium 中使用变量时,虽然 XPath 本身不直接支持变量定义,但可以通过 Python 的字符串格式化方法实现类似功能。例如,可以将变量嵌入到 XPath 表达式字符串中,如: ```python element_id = "B" xpath = f"//div[@id='{element_id}']/child::div" element = driver.find_element(By.XPATH, xpath) ``` 该方式允许根据运行时变量动态构建 XPath 表达式,适用于需要遍历多个元素或根据条件变化查找节点的场景[^2]。 需要注意的是,XPath 1.0 不支持在表达式内部定义和重新赋值变量,只能通过外部传入变量值[^3]。而在 XPath 2.0 及以上版本(如 XSLT)中,变量支持更为丰富,允许在表达式中定义和使用变量。因此,在编写 XPath 表达式时,应根据所使用的解析器版本和语言特性选择合适的变量使用方式[^3]。 --- ### 示例代码 以下是一个使用 `lxml` 库通过变量查询 XML 节点的完整示例: ```python from lxml import etree # 解析 XML 文件 tree = etree.parse("example.xml") nsmap = { 'xis': 'http://www.xchanging.com/ACORD4ALLEDI/1', 'ns': 'http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1' } # 使用变量查询 header = 'Line' result = tree.xpath('//xis:%s' % header, namespaces=nsmap) for e in result: print(e.tag, e.text) ``` 在该示例中,变量 `header` 被拼接到 XPath 表达式中,从而实现动态查询节点的功能[^3]。 --- ### 注意事项 - XPath 表达式中的变量不能在表达式内部重新赋值,仅能通过外部传入值。 - 在 `lxml` 中使用变量时,应确保变量值传递方式正确,避免因字符串拼接导致语法错误。 - 在 Selenium 中使用变量时,推荐使用字符串格式化方法构造 XPath 表达式,以提高代码可读性和维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值