代码之家  ›  专栏  ›  技术社区  ›  Severin

XPath用于获取两个标题之间的标记

  •  1
  • Severin  · 技术社区  · 8 年前

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

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

    在这里,我想得到 div

    2 回复  |  直到 8 年前
        1
  •  3
  •   kjhughes    8 年前

    是的,您使用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>
    

    根据要求。

        2
  •  0
  •   Severin    8 年前

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

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

    这还不够,因为我需要的内容的标题是位于 span 在一个 h2 标记,所以我必须对XPath进行更多修改。

    这就是我想到的:

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

    我用 http://www.xpathtester.com/xpath 在此HTML上:

    <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>