21

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

<td class="name">
   <a href="/blah/somename23123">Some Name</a>
</td>
<td class="name">
   <a href="/blah/somename28787">Some Name2</a>
</td>

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

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

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

 // 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) {...}

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

4

3 回答 3

24

拿来

//td[@class='name']/a

然后用 提取文本,用 提取nodeValue属性getAttribute('href')

除此之外,您可以将 Xpath 查询与联合运算符结合使用,|以便使用

//td[@class='name']/a/@href|//td[@class='name']

也是。

于 2011-07-25T18:19:29.213 回答
18

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

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

如上所述:) 太慢了..

于 2011-07-25T18:22:15.560 回答
5

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

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

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

注意:重要的是限制 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);
 }

PS:此示例仅用于evaluate说明......当信息已经存在于节点时,使用提供最佳性能的方法getAttribute()saveXML()等,以及提供的$nodeValue属性,$textContent等。请参阅@Gordon 对这个特定问题的回答。XPath 子查询(在上下文中)适用于复杂情况 - 或简化您的代码,避免检查hasChildNodes() + 循环以获取$childNodes等,而不会显着提高性能。DOMNode

于 2017-07-10T11:22:03.237 回答