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

如何通过Bash脚本提取网页指定字段对应的Span文本值?

问题

通过curl向https://example.com/发送POST请求,期望从响应中提取指定字段(如USER、CITY)对应的<span>标签内的文本值,输出格式为user : max、city : home。当前使用的脚本仅能提取出USER、CITY字段名,无法获取对应的span内容,需要修改脚本实现需求。

响应示例代码

<tr>
<td>USER</td>
<td><pre class="sf-dump" id="1962752086" data-indent-pad="  ">"<span class="sf-dump-str" title="7 characters">max</span>"
</pre><script>Sfdump("1962752086")</script>
</td>
</tr>

<tr>
<td>CITY</td>
<td><pre class="sf-dump" id="1962752086" data-indent-pad="  ">"<span class="sf-dump-str" title="7 characters">home</span>"
</pre><script>Sfdump("1962752086")</script>
</td>
</tr>

当前使用的脚本

#!/bin/bash

curl -X POST -d "form_data" https://example.com/ | grep -E '<td>USER|<td>CITY' | awk -F'<td>' '{ print $2 }' | awk -F'</td>' '{ print $1 }'

解决方案

方法1:使用awk处理多行内容

awk支持跨多行匹配,先定位目标字段行并记录字段名,再关联后续包含span的行提取文本:

#!/bin/bash

curl -X POST -d "form_data" https://example.com/ | awk '
# 匹配USER/CITY所在行,提取字段名并转小写
/<td>USER|<td>CITY/ {
    gsub(/<\/?td>/, "", $0)
    field = tolower($0)
    next
}
# 已记录字段名时,提取span内的文本并输出
field != "" && /<span class="sf-dump-str"/ {
    gsub(/.*<span[^>]+>([^<]+)<\/span>.*/, "\\1", $0)
    printf "%s : %s\n", field, $0
    field = ""
}
'

方法2:结合grep和sed提取块内容

先抓取包含目标字段的整个<tr>代码块,再从中拆分字段名和span值:

#!/bin/bash

curl -X POST -d "form_data" https://example.com/ | grep -A5 -B1 '<td>USER\|CITY' | sed -n '
# 提取字段名并转小写
/<td>USER\|CITY/ {
    s/<\/\?td>//g
    field = tolower($0)
}
# 提取span内容并按格式输出
/<span class="sf-dump-str"/ {
    s/.*<span[^>]*>\([^<]*\)<\/span>.*/\1/
    printf "%s : %s\n", field, $0
}
'

核心改进点

原脚本仅单独抓取字段名所在行,新方案通过关联字段行和后续的span行,实现了字段名与对应值的配对提取,满足输出格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:15:29