2016-08-21 47 views
0

我正在尝试编写一个小应用程序来从Wikipedia页面提取内容。当我第一次想到它时,我认为我可以将包含XPath内容的div作为目标,但在了解维基百科如何构建其文章之后,我很快发现并不那么容易。在获取页面时分离内容的最佳方式是选择两组h2标签之间的内容。XPath在两个标题之间获取标记

例子: <h2>Title</h2> <div>Some Content</div> <h2>Title</h2>

在这里,我会想套头之间的div。我试着用XPath来做这件事,但没有成功。我将更深入地研究XPath,因为我认为这是我需要用来实现我想要的,但是在我深入研究之前,我想听听你们对此有何看法。 XPath是否正确或者我有其他更简单的选择?我用C#编写应用程序,如果这有什么区别的话。

回答

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

这是正是我正在寻找的!谢谢:-)在我回家测试后,我会标记为正确答案。 – SeverinDK

+0

我在自己的答案中添加了正确的答案。尽管你的回答确实指引着我朝着正确的方向前进! – SeverinDK

+0

不客气。如果有帮助,请[**接受**](http://meta.stackoverflow.com/q/5234/234215)这个答案。谢谢。 (不知道你的意思是什么*我添加了我自己的答案正确的答案*,除非你的意思是你必须作出调整 - 我没有看到另一个SO答案在这里发布到你这个问题。) – kjhughes

0

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

我无法使= 'Text'部分工作,但[text() = 'text']

这仅仅是不够的,因为我需要的内容的标题是在h2标签的span内的位置替换它,所以我必须更多地调整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> 
相关问题