我有一个XML文件(从HTML转换而来),其中包含以下字段:
<tr>
<td data-title="Date">2018-01-01</td>
<td data-title="Version"><a href="https://some-link">25.1</a></td>
</tr>
<tr>
<td data-title="Date">2018-03-01</td>
<td data-title="Version"><a href="https://some-link">24.1</a></td>
</tr>
我一直在使用'xmllint'来提取单个值:
textarea=$(echo "$xml" | xmllint --xpath 'string(//*[@id="content"])' 2>/dev/null )
和多个值:
list=$(echo "$xml" | xmllint --xpath 'string(/html/body/div/ul)' 2>/dev/null )
但现在我想从每个记录中提取两个字段,格式为CSV格式。
我最接近的是:
xpath tr/*[@data-title="Date" or @data-title="Version"]/text()
Object is a Node Set :
Set contains 20 nodes:
1 TEXT
content=Apr 9, 2018 6:13 PM UTC
2 TEXT
content=Mar 21, 2018 10:41 PM UTC
3 TEXT
content=Mar 19, 2018 9:22 PM UTC
你能告诉我一个用更好的xpath实现这个目标的方法吗?
答案 0 :(得分:0)
这是一种使用xmllint
的方法xmllint --html --xpath '//tr/td[@data-title="Date"] | //tr/td[@data-title="Version"]' test.html | sed -re 's%(</[^>]+>)%\1\n%g'
输出:
<td data-title="Date">2018-01-01</td>
<td data-title="Version"><a href="https://some-link">25.1</a></td>
<td data-title="Date">2018-03-01</td>
<td data-title="Version"><a href="https://some-link">24.1</a></td>
--html
选项以指示html输入//
添加到xpath以搜索相对路径。您的xpath在启动时没有任何斜杠,因此xpath是相对于当前节点的。在xmllint shell上,与您使用cd
命令的方式相关。|
运算符搜索两个或更多xpath。