假设我有一个已加载的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>
但我需要一种方法来只得到"玩家.aspx?字母=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 标签的值吗?谢谢!
使用:
//a/@href[contains(., 'letter')]
这将选择字符串值(属性的(包含字符串"letter"
的任何a
的任何href
属性 。
XPath 查询返回属性本身(即DOMAttr
对象(而不是元素(即DOMElement
对象(。这很好,这似乎是您想要的,但是将它们附加到文档中是问题所在。DOMAttr
不是文档树中的独立节点;它与DOMElement
有关,但不是通常意义上的孩子。因此,直接将DOMAttr
附加到文档是无效的。
从 W3C 规范:
。
Attr
对象继承Node
接口,但由于它们实际上不是它们所描述的元素的子节点,因此 DOM 不认为它们是文档树的一部分。DOM 认为属性是元素的属性,而不是与它们关联的元素具有单独的标识
要么将DOMAttr
与DOMElement
关联并附加该元素,要么提取DOMAttr
的值并根据需要使用它。
若要仅追加其纯文本值,请在DOMText
节点中使用其值并追加该值。例如,更改此行:
$newDom->appendChild($node);
对此:
$newDom->appendChild(new DOMText($node->value));
试试这个。
$xml_string = 'your xml string';
$xml = simplexml_load_string($xml_string);
foreach($xml->a[0]->attributes() as $href => $value) {
$myAnchorsValues[] = $value;
}
var_dump($myAnchorsValues);