DOMXpath - Get href attribute and text value of an a element

后端 未结 3 1261
太阳男子
太阳男子 2020-11-30 09:11

So I have a HTML string like this:


   Some Name



        
相关标签:
3条回答
  • 2020-11-30 09:20

    Fetch

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

    and then pluck the text with nodeValue and the attribute with getAttribute('href').

    Apart from that, you can combine Xpath queries with the Union Operator | so you can use

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

    as well.

    0 讨论(0)
  • 2020-11-30 09:22

    Simplest way, evaluate is for this task!

    The simplest way to obtain a value is by evaluate() method:

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

    Note: important to limit XPath returns to 1 item (the first a in this case), and cast the value with string() or round(), etc.


    So, in a set of multiple items, using your foreach code,

     $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: this example is only for evaluate's illustration... When the information already exists at the node, use what offers best performance, as methods getAttribute(), saveXML(), etc. and properties as $nodeValue, $textContent, etc. supplied by DOMNode.
    See @Gordon's answer for this particular problem.
    The XPath subquery (at context) is good for complex cases — or symplify your code, avoiding to check hasChildNodes() + loop for $childNodes, etc. with no significative gain in performance.

    0 讨论(0)
  • 2020-11-30 09:23

    To reduce the code to a single loop, try:

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

    As per above :) Too slow ..

    0 讨论(0)
提交回复
热议问题