【问题标题】:Get all the nodes until a different one with XPATH使用 XPATH 获取所有节点,直到另一个节点
【发布时间】:2016-08-22 22:29:17
【问题描述】:

我正在使用 Xpath 使用 PHP 分析 HTML 节点。

类似以下情况:

<html>
  <body>
    <div>
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p>
        <span>Span 1</span>
        <p>Parag 3</p>
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p>
        <span>Span 1</span>
        <p>Parag 3</p>
    </div>
  </body>
</html>

我使用循环来浏览这些节点,但我遇到的问题是只能在标题之间获取节点。 其实我想把每个h2之间的内容分开。

我试过类似的东西:

//h2/following-sibling::*[1 = count(preceding-sibling::h3[1])]

但这并不好用。

有人有想法吗?

非常感谢。

日本

编辑

对不起,我的例子不清楚。我试图更好地解释我的问题。

我正在废弃一个标签没有相同标识类的网页。

$html = '<html>
  <body>
    <div>
      <article id="article1">
        <h2 class="about">Title 1</h2>
          <p>Parag 1.1</p>
          <p>Parag 1.2</p>
          <span>Span 1.1</span>
          <p>Parag 1.3</p>
        <h2 class="ideas">Title 2</h2>
          <p>Parag 1.4</p>
          <p>Parag 1.5</p
        <h2 class="final">Title 3</h2>
          <p>Parag 1.6</p>
          <span>Span 1.2</span>
          <p>Parag 1.7</p>
      </article>
      <article id="article2">
        <h2 class="previously">Title 1</h2>
          <p>Parag 2.1</p>
        <h2 class="about">Title 2</h2>
          <p>Parag 2.2</p>
          <span>Span 2.1</span>
          <p>Parag 2.3</p>
        <h2 class="final">Title 3</h2>
          <p>Parag 2.4</p>
          <span>Span 2.2</span>
      </article>
    </div>
  </body>
</html>'

对于每篇文章(位于同一页面内),我只想在 h2 标签之后获取具有“about”类的节点,直到下一个 h2 标签,无论其类或内容如何。

为此,我使用 PHP 脚本:

在下面的脚本中,$expression 是我需要的 xpath 表达式:

$expression = "./h2[.,'Title 1']/following-sibling::*[1 = count(preceding-sibling::h2[1])]";

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$main = $xpath->query("//div/article");

foreach ($main as $article) {
    
    echo $xpath->query($expression, $article)->nodeValue;
    echo "<br />";

}

目的是使用循环仅显示从一个 h2 标签到下一个标签的标签。

在我的示例中,我想获取标签:Parag 1.1 / Parag 1.2 / Span 1.1 / Parag 1.3 / Parag 2.2 / Span 2.1 / Parag 2.3

在第 1 条中:

<p>Parag 1.1</p>
<p>Parag 1.2</p>
<span>Span 1.1</span>
<p>Parag 1.3</p>

还有第 2 条:

<p>Parag 2.2</p>
<span>Span 2.1</span>
<p>Parag 2.3</p>

我希望它很清楚。

谢谢

【问题讨论】:

  • 你的 html 中的 h3 在哪里?而且您的要求也不清楚。请重新整理您的问题。
  • 请更改示例 html:例如使所有标签文本唯一,然后说出您想通过 xpath 找到什么标签
  • 我编辑了帖子以提供最佳示例

标签: xml xpath


【解决方案1】:

对于这个标记,

<html> 
  <body> 
    <div> 
      <h2>A</h2>  
      <p>1</p>  
      <p>2</p>  
      <span>3</span>  
      <p>4</p>  

      <h2>B</h2>  
      <p>5</p>  
      <p>6</p>  

      <h2>C</h2>  
      <p>7</p>  
      <p>8</p>  
      <span>9</span>  
      <p>10</p> 
    </div> 
  </body> 
</html>

这个 XPath,

//*[preceding-sibling::h2 = 'B' and following-sibling::h2 = 'C']

将选择 "B""C" 标题之间的标记,

<p>5</p>
<p>6</p>

按要求(如果我猜对了——问题陈述不清楚)。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2023-03-27
    • 2017-02-24
    • 2011-01-25
    • 2013-07-19
    • 1970-01-01
    • 2021-12-26
    • 2014-08-17
    相关资源
    最近更新 更多