使用xmllint

时间:2016-09-02 09:26:14

标签: html xml linux xml-parsing xmllint

请考虑以下HTML代码,如文件example.html

<!DOCTYPE html>
<head>
 <meta charset="utf-8">

<body>
 <div class="container">
  <h1>
   <a href="/">
    <img src="/images/image.png"/>
   </a>
  </h1>
   <ul>
    <li><a href="/" >link1<br /><span>content</span></a></li>
    <li><a href="/folder" >link2<br /><span>more contend</span></a></li>
   </ul>
 </div><!-- .container -->
 <div class="container">
  <ul class="disc">
   <li><strong>no interest 1</strong></li>
   <li><strong>no interest 2</strong></li>
   <li><strong>no interest 3</strong></li>
   <li>keyword1: <strong>unkown_content</strong></li>
   <li>keyword2: <strong>unkown_content</strong></li>
  </ul>
 </div><!-- .container -->
 <div class="container">
  <ul class="disc">
   <li><a href="/folder1">not interested</a></li>
   <li><a href="/folder2">not interested</a></li>
   <li><a href="/folder3">not interested</a></li>
   <li>keyword1: <strong>unkown_content</strong></li>
   <li>keyword2: <strong>unkown_content</strong></li>
  </ul>
 </div><!-- .container -->
</body>
</html>

我希望在第二个unkown_content之后获得keyword1。我有 试图

xmllint --html --xpath "//li[text()='keyword1: ']" example.html 2>/dev/null
<li>keyword1: <strong>unkown_content</strong></li><li>keyword1: <strong>unkown_content</strong></li>

如您所见,这将返回带有keyword1的两个节点。我如何获得最后一次出现的内容?

1 个答案:

答案 0 :(得分:2)

尝试xmllint --html --xpath "(//li[text()='keyword1: '])[last()]" example.html 2>/dev/null

请注意添加[last()] - 它指向//li[text()='keyword1: ']的最后一次出现。 //li[text()='keyword1: ']周围的大括号也是必要的,因为[last()]应用于节点集。