如何通过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
相关产品推荐
相关产品推荐

