如何解决使用 xmllint
我有这样的 HTML 代码
<dl>
<dt><a href="element1" id="element1">element1</a> Version 1 </dt>
<dd>Description 1</dd>
<dt><a href="element2" id="element2">element2</a> Version 2 </dt>
<dd>Description 2</dd>
...
</dl>
我想打印一个像
这样的输出Item: element1,Version: Version1,Description: Description 1
Item: element2,Version: Version2,Description: Description 2
...
我尝试了多种方法,但我最好的方法是:
xmllint --xpath "concat('Item: ',//dl/dt/a/text(),',Version: ',Description: ',//dl/dd/text())" file
#output
Item: element1,Version:,Description: Description 1
问题:
- 无法获取版本
- 无法获取所有元素
解决方法
您可以使用 htql。例如:
text="""<dl>
<dt><a href="element1" id="element1">element1</a> Version 1 </dt>
<dd>Description 1</dd>
<dt><a href="element2" id="element2">element2</a> Version 2 </dt>
<dd>Description 2</dd>
...
</dl>"""
import htql
results = htql.query(text,"<dl>.<dt sep>2-0 {Item=<a>:tx; Version=<a>:xx; Description=<dd>:tx }")
然后显示结果:
>>> results
[('element1',' Version 1 ','Description 1'),('element2',' Version 2 ','Description 2')]
,
如果您不必坚持使用 xmllint,这里有一个纯粹的 bash 方式来完成工作:
cat file | tr '>' '\n' | grep '.\+</' | cut -d '<' -f 1 | awk '{ if (NR%3==1) print "Item: "$0","; if (NR%3==2) print "Version: "$0","; if (NR%3==0) print "Description: "$0;}' | paste -sd ' \n' -
说明:
管道的第一部分:提取感兴趣的数据
cat file | tr '>' '\n' | grep '.\+</' | cut -d '<' -f 1
输出:
element1
Version 1
Description 1
element2
Version 2
Description 2
管道的第二部分:基于行号的前缀名称
awk '{ if (NR%3==1) print "Item: "$0","; if (NR%3==0) print "Description: "$0;}'
输出:
Item: element1,Version: Version 1,Description: Description 1
Item: element2,Version: Version 2,Description: Description 2
管道的最后一部分:每 3 行缝合一次
paste -sd ' \n' -
这将输出您想要的最终结果。
,遵循@seagulf 的建议,使用 python 更容易,
results = htql.query(mystr,"<dl>.<dt sep>2-0 {Item=<a>:tx; Version=<a>:xx; Description=<dd>:tx } \n")
for x in results:
f.write ('{"item": "'+ x[0] + '","version" : "' + x[1] + '","description" : "' + x[2] + '"},\n')
#output
{"item": "element 1","version" : "version 1","description" : "description 1"},{"item": "element 2","version" : "version 2","description" : "description 2"},...
非常感谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。