PHP Xpath:获取包含“letter”的所有href

时间:2012-05-14 22:06:01

标签: php xpath html-parsing

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

3 个答案:

答案 0 :(得分:3)

使用

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

这将选择任何href的{​​{1}}属性,其字符串值(属性)包含字符串a

答案 1 :(得分: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);

答案 2 :(得分:0)

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

来自the W3C specs

  

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

DOMAttrDOMElement相关联,然后附加该元素,或者提取DOMAttr的值并按照您的意愿使用它。

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

    $newDom->appendChild($node);

到此:

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