【问题标题】:DOMXpath - Get href attribute and text value of an a elementDOMXpath - 获取 a 元素的 href 属性和文本值
【发布时间】:2011-07-25 18:10:35
【问题描述】:

所以我有一个这样的 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) {...}

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

【问题讨论】:

    标签: php xpath domxpath


    【解决方案1】:

    获取

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

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

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

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

    也是。

    【讨论】:

    • 感谢您的解决方案,以及关于联合运算符的旁注(它会派上用场)。
    【解决方案2】:

    要将代码简化为单个循环,请尝试:

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

    如上:) 太慢了..

    【讨论】:

    • 感谢您的解决方案。我给了你投票,但戈登得到了投票并接受了答案(毕竟他是第一个发布答案的人:))。
    【解决方案3】:

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

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

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

    注意:限制 XPath 返回一项很重要(在这种情况下是第一个 a),并且 cast 使用 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$textContentsupplied by DOMNode
    请参阅@Gordon 对这个特定问题的回答。
    XPath 子查询(在上下文中)适用于复杂的情况——或者简化您的代码,避免检查 hasChildNodes() + 循环以获取 $childNodes 等,但性能没有显着提升。

    【讨论】:

    • evaluate 这里不像 Javascript 的 eval 那样“危险”。它只是 "subquery" 的替代方法名称(在 XPath 或 DOM 上下文中)。正如其定义所说,“评估给定的 XPath 表达式并在可能的情况下返回类型化结果”.
    猜你喜欢
    • 2011-04-18
    • 2017-10-04
    • 1970-01-01
    • 2020-12-20
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多