【发布时间】: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 找到什么标签
-
我编辑了帖子以提供最佳示例