PHP Xpath:获取所有包含 needle 的 href 值

Posted

技术标签:

【中文标题】PHP Xpath:获取所有包含 needle 的 href 值【英文标题】:PHP Xpath : get all href values that contain needle 【发布时间】:2011-01-24 10:40:12 【问题描述】:

使用 php Xpath 尝试快速拉取 html 页面中的某些链接。

下面将找到 mypage.html 上的所有 href 链接: $nodes = $x->query("//a[@href]");

而以下将找到 description 与我的指针匹配的所有 href 链接: $nodes = $x->query("//a[contains(@href,'click me')]");

我想要实现的是匹配 href 本身,更具体地查找包含某些参数的 url。这在 Xpath 查询中是否可行,还是我应该开始处理第一个 Xpath 查询的输出?

【问题讨论】:

是的,但搜索“needle”会返回 $node->nodeValue(); 中的文本部分,而不是所需的 example.com?param=needle ...? 【参考方案1】:

不确定我是否正确理解了这个问题,但第二个 XPath 表达式已经完成了您所描述的操作。它不匹配A元素的文本节点,而是href属性:

$html = <<< HTML
<ul>
    <li>
        <a href="http://example.com/page?foo=bar">Description</a>
    </li>
    <li>
        <a href="http://example.com/page?lang=de">Description</a>
    </li>
</ul>
HTML;

$xml  = simplexml_load_string($html);
$list = $xml->xpath("//a[contains(@href,'foo')]");

输出:

array(1) 
  [0]=>
  object(SimpleXMLElement)#2 (2) 
    ["@attributes"]=>
    array(1) 
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    
    [0]=>
    string(11) "Description"
  

如您所见,返回的 NodeList 仅包含带有 href 包含 foo 的 A 元素(我知道这就是您要查找的内容)。它包含整个元素,因为 XPath 转换为获取所有具有包含 foo 的 href 属性的 A 元素。然后,您将使用

访问该属性
echo $list[0]['href'] // gives "http://example.com/page?foo=bar"

如果你只想返回属性本身,你必须这样做

//a[contains(@href,'foo')]/@href

请注意,在 SimpleXml 中,这将返回一个 SimpleXml 元素:

array(1) 
  [0]=>
  object(SimpleXMLElement)#3 (1) 
    ["@attributes"]=>
    array(1) 
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    
  

但您现在可以通过

输出网址
echo $list[0] // gives "http://example.com/page?foo=bar"

【讨论】:

这就是我的意思。使用 SimpleXML 时,只有我的 html 文档失败。 xpath 查询虽然有效,但与 DomXpath 一起使用可以满足我的需求。谢谢!

以上是关于PHP Xpath:获取所有包含 needle 的 href 值的主要内容,如果未能解决你的问题,请参考以下文章

Xpath:如果包含特定单词,则获取href

使用 PHP 和 XPath 获取匹配正则表达式的 href

使用 php 和 xpath 获取父元素的内部 HTML

php xpath如何从父元素内的多个元素中获取值

XPath 表达式查找标签名称包含“名称”的元素

Xpath获取一个if href包含字符串的一部分