我使用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标签之后获得带有&#34;关于&#34;直到下一个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>
我希望它非常清楚。
由于
答案 0 :(得分:0)
对于此标记,
<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>
根据要求(如果我猜错了 - 问题陈述不清楚)。