【问题标题】:PHP Xpath: Get all href's that contain "letter"PHP Xpath:获取所有包含“字母”的href
【发布时间】:2012-05-22 10:21:18
【问题描述】:

假设我有一个已加载的 html 文件,我运行此查询:

$url = 'http://www.fangraphs.com/players.aspx';
$html = file_get_contents($url);    
$myDom = new DOMDocument;
$myDom->formatOutput = true;
@$myDom->loadHTML($html);
$anchor = $xpath->query('//a[contains(@href,"letter")]');

这给了我这些锚点的列表,如下所示:

<a href="players.aspx?letter=Aa">Aa</a>

但我需要一种只获取“players.aspx?letter=Aa”的方法。

我想我可以试试:

$anchor = $xpath->query('//a[contains(@href,"letter")]/@href');

但这给了我一个 php 错误,说我在尝试以下操作时无法附加节点:

$xpath = new DOMXPath($myDom);
$newDom = new DOMDocument;
$j = 0;
while( $myAnchor = $anchor->item($j++) ){
   $node = $newDom->importNode( $myAnchor, true );    // import node
   $newDom->appendChild($node);
}

知道如何仅获取第一个查询选择的 href 标记的值吗?谢谢!

【问题讨论】:

  • 这对我来说没有任何错误..我可以看到更多代码吗,例如作为 newDom 的 DOM 的 xml?
  • 是的,抱歉,我不清楚。不是 XML,而是加载的 HTML 文件。您能再看一下原始帖子吗?我已经编辑了它的顶部以反映我是如何获取 DOM 的。
  • 仍然不够——你缺少 xpathnewDom 的初始化位置
  • 对不起,它们刚刚被初始化,所以我把它们排除在外。我已将它们添加到最后一个代码段中。 (在顶部)。再看看?抱歉给您添麻烦
  • 你看了吗?

标签: php xpath html-parsing


【解决方案1】:

试试这个..

$xml_string = 'your xml string';
$xml = simplexml_load_string($xml_string);
foreach($xml->a[0]->attributes() as $href => $value) {
    $myAnchorsValues[] = $value;
}

var_dump($myAnchorsValues);

【讨论】:

  • 其实不是xml……是加载到DOMDocument中的HTML文件。你能再看看原来的帖子吗?我编辑了顶部以包括我从中获取内容的位置。
  • 你可以试试这个解析器:simplehtmldom.sourceforge.net为我工作。如果您需要一个示例,请告诉我,但在文档中会更清楚。
【解决方案2】:

使用

//a/@href[contains(., 'letter')]

这会选择任何a 的任何href 属性,其字符串值(属性的)包含字符串"letter"

【讨论】:

    【解决方案3】:

    您的 XPath 查询返回的是属性本身(即DOMAttr 对象)而不是元素(即DOMElement 对象)。很好,这似乎是您想要的,但是将它们附加到文档是问题所在。 DOMAttr 不是文档树中的独立节点;它与DOMElement 相关联,但不是通常意义上的child。因此,直接将DOMAttr 附加到文档是无效的。

    来自the W3C specs

    Attr 对象继承了Node 接口,但由于它们实际上不是它们所描述的元素的子节点,因此 DOM 不会将它们视为文档树的一部分。 . . . DOM 认为属性是元素的属性,而不是与它们关联的元素具有单独的标识

    要么将DOMAttrDOMElement 关联并附加该元素,要么提取DOMAttr 的值并根据需要使用它。

    要仅附加其纯文本值,请在 DOMText 节点中使用其值并附加该值。例如,改变这一行:

        $newDom->appendChild($node);
    

    到这里:

        $newDom->appendChild(new DOMText($node->value));
    

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2017-09-20
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多