XPath 获取两个标题之间的标记
XPath to get markup between two headings
我正在尝试编写一个小应用程序来从维基百科页面中提取内容。当我第一次想到是否可以时,我认为我可以只定位包含 XPath 内容的 div,但在研究了 Wikipedia 如何构建他们的文章之后,我很快发现这并不是那么容易。获取页面时分隔内容的最佳方法是 select 两组 h2
标签之间的内容。
示例:
<h2>Title</h2> <div>Some Content</div> <h2>Title</h2>
这里我想得到headers组之间的div
。我试着用 XPath 来做这件事,但一点运气也没有。我将更多地研究 XPath,因为我认为这是我需要用来实现我想要的东西,但在我深入研究它之前,我想听听你们对它的看法。 XPath 是正确的方法还是我有其他更简单的选择?如果有任何不同,我会用 C# 编写应用程序。
是的,您在 XPath 方面走在了正确的轨道上 -- 它非常适合 selecting 部分 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']
将select这个内容,
<div>Some Content</div>
<div>More Content</div>
在两个 h2
标题之间,根据要求。
更新地址 OP self-answer:
对于这个新的 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']
到select这个XML,
<p>Paragraph</p>
<ul>
<li>List1</li>
<li>List2</li>
<li>List3</li>
</ul>
<p>Paragraph</p>
根据要求。
在 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>
我正在尝试编写一个小应用程序来从维基百科页面中提取内容。当我第一次想到是否可以时,我认为我可以只定位包含 XPath 内容的 div,但在研究了 Wikipedia 如何构建他们的文章之后,我很快发现这并不是那么容易。获取页面时分隔内容的最佳方法是 select 两组 h2
标签之间的内容。
示例:
<h2>Title</h2> <div>Some Content</div> <h2>Title</h2>
这里我想得到headers组之间的div
。我试着用 XPath 来做这件事,但一点运气也没有。我将更多地研究 XPath,因为我认为这是我需要用来实现我想要的东西,但在我深入研究它之前,我想听听你们对它的看法。 XPath 是正确的方法还是我有其他更简单的选择?如果有任何不同,我会用 C# 编写应用程序。
是的,您在 XPath 方面走在了正确的轨道上 -- 它非常适合 selecting 部分 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']
将select这个内容,
<div>Some Content</div>
<div>More Content</div>
在两个 h2
标题之间,根据要求。
更新地址 OP self-answer:
对于这个新的 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']
到select这个XML,
<p>Paragraph</p>
<ul>
<li>List1</li>
<li>List2</li>
<li>List3</li>
</ul>
<p>Paragraph</p>
根据要求。
在 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>