You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助:如何用XPath提取宜家产品页的jProductData变量?

如何从指定script标签中提取var jProductData的内容?

嘿,作为XPath新手碰到这种情况太正常啦~你当前的XPath已经精准定位到了目标script标签,但因为整个script块里包含多个JS变量,XPath本身没法直接筛选出单个变量的内容,不过我们可以通过两种实用方案解决:

方案1:XPath定位+字符串/正则处理(最通用)

这是适配绝大多数工具的方法,不管你用Python的lxml、Scrapy,还是浏览器控制台都能行。步骤如下:

  1. 先用你的原XPath获取整个script的文本内容:
    //*[@id="mainPadding"]/script[3]/text()
    
  2. 拿到文本后,用正则表达式匹配var jProductData对应的变量内容。比如在Python里可以这么写:
    import re
    
    # 假设script_text是你通过XPath获取到的文本
    script_text = ""
    match_result = re.search(r'var jProductData = (.*?);', script_text, re.DOTALL)
    if match_result:
        jProductData_content = match_result.group(1)
        print(jProductData_content)
    
    这里的re.DOTALL参数很关键,它能让正则里的.匹配换行符,毕竟JS对象通常是多行格式的。

如果是在浏览器控制台测试,代码可以写成这样:

const scriptText = $x('//*[@id="mainPadding"]/script[3]/text()')[0];
const match = scriptText.match(/var jProductData = (.*?);/s);
if (match) console.log(match[1]);

方案2:用XPath 2.0+的字符串函数直接提取(限支持的工具)

如果你使用的工具支持XPath 2.0或更高版本(比如Saxon),可以直接在XPath里嵌套字符串处理函数:

substring-before(
  substring-after(
    //*[@id="mainPadding"]/script[3]/text(),
    'var jProductData = '
  ),
  ';'
)

这个表达式的逻辑是:先截取var jProductData = 之后的所有内容,再截取到第一个;之前的部分。不过要注意,如果jProductData的对象内部包含;(比如某些属性值里的分号),这个方法可能会提前截断,所以方案1的正则更稳妥。

内容的提问来源于stack exchange,提问作者Shah Rezza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:56:59