在Bash中如何提取HTML文件内指定span标签的price-amount属性值
问题原因
你遇到的报错和取不到值有两个核心原因:
xpath工具默认仅支持严格格式的XML解析,而绝大多数真实场景的HTML页面都存在标签未闭合、属性不规范等非标准XML语法,无法直接被XML解析器识别,所以会报语法错误。- 你写的XPath表达式不符合需求:你要提取的是
span标签的price-amount属性值,而表达式里的/text()是用来提取节点的文本内容,就算HTML格式合规也取不到目标值。
修复原有xpath方案的方法
可以先通过tidy工具把非标准HTML转换为合规的XHTML格式,再用xpath解析:
- Debian/Ubuntu系安装依赖:
sudo apt install tidy libxml-xpath-perl - RHEL/CentOS系安装依赖:
sudo dnf install tidy perl-XML-XPath
修改后可用的代码:
filename='./page.html' curl -s "你的目标页面链接" > "$filename" # 忽略tidy的格式警告,输出规范XHTML tidy -q -asxhtml -utf8 "$filename" > "${filename}.xhtml" 2>/dev/null # 修正xpath表达式,提取price-amount属性值 number=$(xpath -q -e 'string(//span[@id="product542"]/@price-amount)' "${filename}.xhtml") echo "$number" # 清理临时文件 rm -f "${filename}.xhtml"
更简单的替代方案
方案1:使用pup(推荐,HTML专用解析工具)
pup是命令行场景专门处理HTML的工具,和处理JSON的jq定位类似,不需要兼容XML语法,使用更简单:
首先安装pup:Debian/Ubuntu系可直接执行sudo apt install pup
提取代码:
# 支持管道处理,不需要存临时文件 number=$(curl -s "你的目标页面链接" | pup 'span#product542 attr{price-amount}') echo "$number"
方案2:使用xmllint内置HTML解析器
不需要额外安装tidy,直接调用xmllint的HTML解析模式处理非规范页面:
number=$(curl -s "你的目标页面链接" | xmllint --html --xpath 'string(//span[@id="product542"]/@price-amount)' - 2>/dev/null) echo "$number"
方案3:正则匹配(仅适合固定结构场景)
如果页面结构不会变动,不想安装额外工具,可以用grep正则匹配提取,缺点是页面结构稍有变化就会失效:
number=$(curl -s "你的目标页面链接" | grep -oP 'id="product542".*?price-amount="\K[\d.]+') echo "$number"
内容的提问来源于stack exchange,提问作者InfT
相关产品推荐
相关产品推荐

