我正在尝试解决这个问题:我获得了HTML源代码,我想将表及其内容提取到变量中。 例如:
<table>
content1
</table>
some more code
<table>
content2
</table>
我想将第一个表保存到var1,将第二个表保存到var2,所以我可以写:
echo $var1
我得到了:
<table>
content1
</table>
没有标识符如何区分这些表。你知道如何解决这个问题吗?
由于
答案 0 :(得分:2)
我将分解我尝试使用xmllint
尝试的答案,activerecord-import支持--html
标记来解析html
个文件
$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | tr -d '\n' | awk -F"-------" '{print $1,$2}'
content1 content2
首先,您可以通过解析下面的HTML文件来检查HTML文件的完整性,该文件确认文件是否符合标准,或者如果看到则抛出错误: -
$ xmllint --html YourHTML.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<table>
content1
</table>
<table>
content2
</table>
</body></html>
我的原始YourHTML.html
文件只是: -
$ cat YourHTML.html
<table>
content1
</table>
<table>
content2
</table>
现在为价值提取部分;执行的步骤: -
启动文件解析从根节点到重复节点(//html/body/table
)并在HTML解析器&amp;中运行xmllint
交互式shell模式(xmllint --html --shell
)
明确地运行命令会产生一个结果,
/ > -------
<table>
content1
</table>
-------
<table>
content2
</table>
/ >
现在使用sed
删除特殊字符,即sed '/^\/ >/d' | sed 's/<[^>]*.//g'
生成
content1
-------
content2
现在使用tr
从上述命令中删除换行符,以便awk
可以使用字段分隔符-------
content1 -------content2
上面输出的awk
命令将根据需要生成文件; awk -F"-------" '{print $1,$2}
content1 content2
将它放在shell脚本中,看起来像
#!/bin/bash
# extract table1 value
table1Val=$(echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | tr -d '\n' | awk -F"-------" '{print $1}')
# extract table2 value
table2Val=$(echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | tr -d '\n' | awk -F"-------" '{print $2}')
# can be extended up-to any number of nodes
或者很简单: -
#!/bin/bash
echo "cat //html/body/table" | xmllint --html --shell file | sed '/^\/ >/d' | \
sed 's/<[^>]*.//g' | tr -d '\n' | awk -F"-------" '{print $1,$2}' | \
while IFS= read -r value1 value2
do
# Do whatever with the values extracted
done
P.S: - 通过减少awk
/ sed
命令组合的数量,可以减少/简化命令数量。这只是一个有效的解决方案。我使用的xmllint
版本是xmllint: using libxml version 20706