Bash脚本提取HTML表格数据失败,请求修复指导
修复提取HTML表格内容的Bash脚本
需求说明
有一个结构固定、仅数据值变动的网页,包含简单HTML表格,需要提取表格内容为以下格式:
Examiner: Person Qualification: Teacher Nation: Any
原脚本无任何输出,修复后的完整脚本如下:
#!/bin/bash URL="http://thewebpageurl" # 抓取页面内容,并用tr压缩多余空白和换行 HTML=$(curl -s "$URL" | tr -s '\n' ' ') # 提取<table>到</table>之间的内容,处理跨行情况 TABLE_HTML=$(echo "$HTML" | grep -o '<table[^>]*>.*</table>') # 提取每行<tr>中的两个<td>内容,整理成目标格式 echo "$TABLE_HTML" | awk ' BEGIN { RS = "</tr>" } { # 提取第一个<td>的文本 match($0, /<td[^>]*>([^<]*)<\/td>/, label) # 提取第二个<td>的文本 match(substr($0, RSTART+RLENGTH), /<td[^>]*>([^<]*)<\/td>/, value) # 清理前后空白并输出,空行分隔 if (label[1] != "" && value[1] != "") { gsub(/^[ \t]+|[ \t]+$/, "", label[1]) gsub(/^[ \t]+|[ \t]+$/, "", value[1]) print label[1] " " value[1] "\n" } }' | sed '$d' # 移除最后一行多余的空行
原脚本问题分析
- Grep正则错误:原脚本的
grep -o '\<table\[^\>\]\*\>.\*\</table\>'存在转义错误,且grep默认单行模式下.*无法匹配跨行内容,导致无法提取完整表格。 - Sed语法错误:
sed 's/\<\\/table.\*//'的转义和匹配逻辑完全错误,没有实际作用。 - Awk处理逻辑缺陷:原awk的分隔符和替换规则无法正确提取
<td>内的文本,且没有处理空白字符,导致输出混乱。
修复要点
- 使用
tr -s '\n' ' '将页面内容的换行压缩为空格,避免跨行匹配问题。 - 修正grep的正则表达式,直接匹配
<table>标签范围的内容。 - 用awk的
match函数精准提取每个<td>内的文本,并用gsub清理前后空白。 - 最后用sed移除末尾多余的空行,保证输出格式符合要求。
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

