XPath在两个标题之间得到标记

时间:2016-08-21 12:41:58

标签: html xml xpath web wikipedia

我正在尝试编写一个小应用程序来从维基百科页面中提取内容。当我第一次想到它时,我认为我可以只使用XPath来定位包含内容的div,但在研究了维基百科如何构建他们的文章之后,我很快发现这不会那么容易。获取页面时分离内容的最佳方法是选择两组h2标记之间的内容。

实施例: <h2>Title</h2> <div>Some Content</div> <h2>Title</h2>

在这里,我希望在标头集之间获得div。我尝试用XPath做这个,但没有运气。我将更多地考虑XPath,因为我认为这是我需要用来实现我想要的东西,但在我看得太多之前,我想听听你们对它的看法。 XPath是正确的方法还是我有其他更简单的选择?我用C#编写应用程序,如果这有任何区别的话。

2 个答案:

答案 0 :(得分:2)

是的,您使用XPath处于正确的轨道 - 它是选择XML文档部分的理想选择。

例如,对于此XML,

<r>
   <h2>Title A</h2>
   <div>Some Content</div>
   <div>More Content</div>
   <h2>Title B</h2>
</r>

这个XPath,

//div[preceding-sibling::h2 = 'Title A' and following-sibling::h2 = 'Title B']

将选择此内容,

<div>Some Content</div>
<div>More Content</div>
根据要求,在两个h2标题之间

更新以解决OP的自我回答:

对于这个新的XML示例,

<div>
    <h2><span>Summary</span></h2>
    <p>Paragraph</p>
    <ul>
        <li>List1</li>
        <li>List2</li>
        <li>List3</li>
    </ul>
    <p>Paragraph</p>

    <h2><span>Location</span></h2>
    <p>Paragraph</p>
</div>

我在上面提供的XPath可以很容易地进行调整,

//*[preceding-sibling::h2 = 'Summary' and following-sibling::h2 = 'Location']

选择此XML,

<p>Paragraph</p>  
<ul>
   <li>List1</li>
   <li>List2</li>
   <li>List3</li>
</ul>    
<p>Paragraph</p>

按要求。

答案 1 :(得分:0)

在kjhughes建议的帮助下,我设法让代码正常工作。

我无法让= 'Text'部分工作,但将其替换为[text() = 'text']

仅凭这一点还不够,因为我需要的内容的标题是位于span标签中h2内的位置,所以我不得不更多地调整XPath。

这就是我提出的:

//*[preceding-sibling::h2::following-sibling::span[text() = 'Summary'] and following-sibling::h2::following-sibling::span[text() = 'Location']]

我在此HTML上使用http://www.xpathtester.com/xpath对其进行了测试:

<div>
    <h2><span>Summary</span></h2>
    <p>Paragraph</p>
    <ul>
        <li>List1</li>
        <li>List2</li>
        <li>List3</li>
    </ul>
    <p>Paragraph</p>

    <h2><span>Location</span></h2>
    <p>Paragraph</p>
</div>

这给了我以下结果:

<p>Paragraph</p>
<ul>
    <li>List1</li>
    <li>List2</li>
    <li>List3</li>
</ul>
<p>Paragraph</p>