DOMXpath - 获取元素的href属性和文本值

Mar*_*vić 17 php xpath domxpath

所以我有一个像这样的HTML字符串:

<td class="name">
   <a href="/blah/somename23123">Some Name</a>
</td>
<td class="name">
   <a href="/blah/somename28787">Some Name2</a>
</td>
Run Code Online (Sandbox Code Playgroud)

使用XPath我可以使用此Xpath查询获取href属性的值:

 $domXpath = new \DOMXPath($this->domPage);
 $hrefs = $domXpath->query("//td[@class='name']/a/@href");
 foreach($hrefs as $href) {...}
Run Code Online (Sandbox Code Playgroud)

而获取文本值更容易,如下所示:

 // Xpath auto. strips any html tags so we are 
 // left with clean text value of a element
 $domXpath = new \DOMXPath($this->domPage);
 $names = $domXpath->query("//td[@class='name']/");
 foreach($names as $name) {...}
Run Code Online (Sandbox Code Playgroud)

现在我很想知道,我怎样才能将这两个查询结合起来,只用一个查询来获取两个值(如果它是类似的甚至是可行的?).

Gor*_*don 20

//td[@class='name']/a
Run Code Online (Sandbox Code Playgroud)

然后使用nodeValue和带有属性的文本getAttribute('href').

除此之外,您可以将Xpath查询与Union Operator结合使用,|以便您可以使用

//td[@class='name']/a/@href|//td[@class='name']
Run Code Online (Sandbox Code Playgroud)

同样.


Rya*_*yan 15

要将代码减少到单个循环,请尝试:

$anchors = $domXpath->query("//td[@class='name']/a");
foreach($anchors as $a)
{ 
    print $a->nodeValue." - ".$a->getAttribute("href")."<br/>";
}
Run Code Online (Sandbox Code Playgroud)

如上所述:)太慢..


Pet*_*uss 5

最简单的方法,evaluate就是为了这个任务!

获取值的最简单方法是通过evaluate()方法

$xp = new DOMXPath($dom);
$v = $xp->evaluate("string(/etc[1]/@stringValue)");
Run Code Online (Sandbox Code Playgroud)

注意:将 XPath 限制为 1 项(a在本例中为第一项)并使用or等强制转换值很重要。string()round()


因此,在一组多个项目中,使用您的foreach代码,

 $names = $domXpath->query("//td[@class='name']/");
 foreach($names as $contextNode) {
    $text = $domXpath->evaluate("string(./a[1])",$contextNode);
    $href = $domXpath->evaluate("string(./a[1]/@href)",$contextNode);
 }
Run Code Online (Sandbox Code Playgroud)

PS:这个例子只是为了evaluate的说明......当信息的节点,利用已经存在哪些优惠最佳的性能,如方法getAttribute()saveXML()等和性能$nodeValue$textContent的供应DOMNode
有关此特定问题,请参阅 @Gordon 的回答。
XPath的子查询(在上下文中)是复杂的情况下,良好的-或symplify你的代码,避免检查hasChildNodes() +循环为$的childNodes,等在性能无显着性收益。