将HTML表解析为Bash中的变量

时间:2016-08-10 09:20:26

标签: html bash

我正在尝试解决这个问题:我获得了HTML源代码,我想将表及其内容提取到变量中。 例如:

<table>
content1
</table>
some more code
<table>
content2
</table>

我想将第一个表保存到var1,将第二个表保存到var2,所以我可以写:

echo $var1

我得到了:

<table>
content1
</table>

没有标识符如何区分这些表。你知道如何解决这个问题吗?

由于

1 个答案:

答案 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