UNIX解析HTML页面显示标签的内容 - 一个班轮?

时间:2010-05-24 16:54:22

标签: linux unix grep html-parsing cut

我有一个HTML文件,我对<pre> </pre>标记所包含的数据感兴趣。有没有可以做到这一点的单线程?

示例文件:

<html>
<title>
Hello There!
</title>
<body>
<pre>
John   Working
Kathy  Working
Mary   Working
Kim    N/A
</pre>
</body>
</html>

输出应为:

John 
Kathy 
Mary 
Kim 

非常感谢大家,谢谢!

4 个答案:

答案 0 :(得分:4)

抓住twig tools。其中一件事叫做xml_grep。你的问题缩小为

cat foo.txt | xml_grep --nowrap pre 

prexpath表达式。 接下来是一些简单的文本处理,即使您的XML格式不同,这也会有效。

建议 - 不要使用sed和其他基于流的文本处理工具来处理像XML这样的结构化数据。使用适当的解析器。

答案 1 :(得分:2)

如果您有XHTML,请使用xmlstarlet。如果你没有,那么先将它传递给HTML Tidy,然后将其转换为XHTML。

答案 2 :(得分:2)

因为您特别询问了使用sed的解决方案...假设有趣的行总是在包含<pre></pre>的行之间(看起来完全一样)并且有趣的内容永远不会出现与开始或结束标记相同的行,并假设第一个这样的块是您想要提取的唯一一个,并假设虽然您理解这是解决此问题的the wrong way,但您仍然希望这样做它,然后你可以使用sed这样做,例如:

sed '1,/<pre>/d;/<\/pre>/,$d'

删除从第一行到包含<pre>的所有行以及从包含</pre>到最后一行的所有行。

(FWIW,我宁愿使用XPath表达式来选择有趣的内容。例如,使用xmlstarlet as suggested by Ignacio Vazquez-Abrams它可以是这样的:xmlstarlet sel -t -v /html/body/pre。)

答案 3 :(得分:1)

我的Perl-fu很弱,但这适用于你的例子:

$ cat file.html | perl -e'while(<>){if(/<\/pre>/){$a=0;}if($a){print}if(/<pre>/){$a=1;}}' | cut -f1 -d' '
John
Kathy
Mary
Kim