5

假设我有一个已加载的 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 标记的值吗?谢谢!

4

3 回答 3

3

使用

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

这将选择任何hrefa字符串值(属性的)包含字符串"letter"的任何属性。

于 2012-05-15T13:12:23.923 回答
0

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

W3C 规范

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

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

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

    $newDom->appendChild($node);

对此:

    $newDom->appendChild(new DOMText($node->value));
于 2012-05-15T19:31:11.020 回答
0

尝试这个..

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

var_dump($myAnchorsValues);
于 2012-05-15T00:01:12.823 回答