使用 Bash 解析 HTML 页面

使用 Bash 解析 HTML 页面

我正在尝试编写一个 Bash 脚本,用于从 HTML 页面中提取信息(使用wget)。我知道我的信息将位于<h*>标签之间,但是有没有一种好的方法可以获取这些信息?

为了更准确,我们举一个例子:

< h1>header1</ h1>
< h2>header2</ h2>
< h2>otherHeader2</ h2> <
h1>lastHeader1</ h1>
< h2>lastHeader2</ h2>

我想提取“otherHeader2”,也就是 header1 之后的第二个(但它可能在任何地方)标题。

答案1

永远不要使用正则表达式来解析 html。始终使用适当的 html 或 xml 解析器。例如,使用xmlstarlet

$ xmlstarlet sel -t -v '//h2[2]' html.html 
otherHeader2

答案2

这是一个简单的 Python 脚本,它将解析您的 html 并将所有值放入列表中并打印出来。您可以用 Python 编写其余脚本,也可以从 Python 调用此脚本,或者将此简短代码作为片段插入 Bash。查看下面的示例。

测试.html

< h1>header1< /h1>
< h2>header2< /h2>
< h2>otherHeader2< /h2>
< h1>lastHeader1< /h1>
< h2>lastHeader2< /h2>

解析头文件.py

#!/usr/bin/env python
import sys, re
print re.findall(r'< h\d>(.*)< /h\d>', sys.stdin.read())

可以从 bash 调用脚本

cat test.html | parse_header.py

python 代码可以放入 bash 脚本中

cat test.html | python -c "import sys, re;print re.findall(r'< h\d>(.*)< /h\d>', sys.stdin.read())"

我认为最后一个选项对于你的情况来说不太好读。如果你有一些简单的代码,不值得把它放在自己的脚本中,那么这个选项更有意义。

相关内容