尝试在 class 标签与 PHP DOMXPATH 之间获取数据
try to grab data between class tag with PHP DOMXPATH
我试图在我的 html 文档中获取两个 css class 标签之间的数据。
这里是例子。
<p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p>
我不知道如何获取
class heading10 和 heading11 之间的
数据。
我试过//p[@class="heading10"]//following-sibling::p]
,它会抓取class标题10之后的所有<p>
。
试试
//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]
编辑:
对@jpaugh 的更多解释:
OP 的 xpath 获取 class="heading10"
元素之后的所有同级 p
元素。我已经添加了对这些元素的 position()
的限制,使其小于带有 class="heading11"
.
的 p
元素的位置
以下代码已确认适用于 php 5.5,不适用于 php 5.4(感谢 @slphp):
$t = '<?xml version="1.0"?>
<root><p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p></root>';
$d = DOMDocument::LoadXML($t);
$x = new DOMXpath($d);
var_dump($x->query('//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]'));
class DOMNodeList#6 (1) {
public $length =>
int(2)
}
请注意,如果 <p class="heading10">
不是第一个 p
元素,那么您可能需要减去它们:
//p[@class="heading10"]/following-sibling::p[position()<(count(//p[@class="heading11"]/preceding-sibling::p) - count(//p[@class="heading10"]/preceding-sibling::p))]
为了便于阅读,按行拆分:
//p[@class="heading10"]
/following-sibling::p[
position()<(
count(//p[@class="heading11"]/preceding-sibling::p) -
count(//p[@class="heading10"]/preceding-sibling::p)
)
]
我试图在我的 html 文档中获取两个 css class 标签之间的数据。
这里是例子。
<p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p>
我不知道如何获取
class heading10 和 heading11 之间的
数据。我试过//p[@class="heading10"]//following-sibling::p]
,它会抓取class标题10之后的所有<p>
。
试试
//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]
编辑:
对@jpaugh 的更多解释:
OP 的 xpath 获取 class="heading10"
元素之后的所有同级 p
元素。我已经添加了对这些元素的 position()
的限制,使其小于带有 class="heading11"
.
p
元素的位置
以下代码已确认适用于 php 5.5,不适用于 php 5.4(感谢 @slphp):
$t = '<?xml version="1.0"?>
<root><p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p></root>';
$d = DOMDocument::LoadXML($t);
$x = new DOMXpath($d);
var_dump($x->query('//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]'));
class DOMNodeList#6 (1) {
public $length =>
int(2)
}
请注意,如果 <p class="heading10">
不是第一个 p
元素,那么您可能需要减去它们:
//p[@class="heading10"]/following-sibling::p[position()<(count(//p[@class="heading11"]/preceding-sibling::p) - count(//p[@class="heading10"]/preceding-sibling::p))]
为了便于阅读,按行拆分:
//p[@class="heading10"]
/following-sibling::p[
position()<(
count(//p[@class="heading11"]/preceding-sibling::p) -
count(//p[@class="heading10"]/preceding-sibling::p)
)
]