我有一个 HTML 文档(过于简化时)如下所示:
<html>
<body>
<a href="...">...</a>
<a href="...">...</a>
<a href="...">...</a>
...
</body>
</html>
我想要做的是提取行分隔输出中的 URL。输入 xmllint:
$ xmllint --html --xpath //a/@href
href="..." href="..." href="..."
它获取属性,包括名称的整个属性,并以空格分隔输出它们。如何获取包含属性值的行列表href
?我想要这样的输出:
...
...
...
其中是在每个元素的属性...
中找到的 URL 。href
a
如何正确格式化此输出?
答案1
鉴于file.html
:
<html>
<body>
<a href="url1">link text 1</a>
<a href="url2">link text 2</a>
<a href="url3">link text 3</a>
...
</body>
</html>
我们可以使用 Unix 管道发送现有的xmllint
输出,sed
并查看以下结果:
$ xmllint --html --xpath //a/@href input.html | sed 's/ href="\([^"]*\)"/\1\n/g'
url1
url2
url3
解释
单独使用xmllint
,我们只能得到:
$ xmllint --html --xpath //a/@href input.html
href="url1" href="url2" href="url3"%
- 尾随
%
表示没有尾随换行符
类 Unix 系统的好处之一是我们可以受益于道格·麦克罗伊的烟斗功能,所以我们不必让一个程序尝试做所有事情,事实上我们鼓励组合程序来满足我们的需求。
因此,发现xmllint
的输出不令人满意,我们通过管道将其与我们的sed
命令结合起来,其中:
- 搜索
href="URL"
单位 - 使用
\(
\)
分组包围 URL 部分 - 并将其替换为,
\1\n
以便它引用我们在 URL 周围定义的组,同时还在匹配的后面添加一个新行\1
通过这种方式,我们组合xmllint
和sed
以获得所需的行分隔输出,每行一个 URL。
答案2
您是否考虑过使用 sed:
sed -n 's/.*href="\([^"]*\).*/\1/p'