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

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标签的值吗?谢谢!


这对我来说没有任何错误..我能看到更多的代码吗,例如作为newDom DOM的xml? - Explosion Pills
是的,抱歉,我表达不清楚。它不是XML,而是加载的HTML文件。你能再看一下原帖吗?我已经编辑了顶部部分以反映我如何获取DOM。 - sfgiants2010
还不够——你漏掉了xpathnewDom的初始化位置。 - Explosion Pills
抱歉,它们只是被初始化了,所以我将它们省略了。我已经将它们添加到最后一个代码段中(在顶部)。再看一遍?对此给您带来的麻烦感到抱歉。 - sfgiants2010
你有看吗? - sfgiants2010
3个回答

3

用途:

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

这段内容指的是选择任何包含字符串 "letter" 的 a 标签的 href 属性。

0

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

来自W3C规范

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

要么将DOMAttrDOMElement关联并附加该元素,要么提取DOMAttr的值并按您的意愿使用它。

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

    $newDom->appendChild($node);

转换为:

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

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);

其实它不是XML……它是加载到DOMDocument中的HTML文件。你能再看一下原始帖子吗?我编辑了顶部部分,包括我从哪里获取内容。 - sfgiants2010
你可以尝试使用这个解析器:http://simplehtmldom.sourceforge.net/,它对我很有效。 如果你需要一个例子,请让我知道,但在文档中非常清晰。 - BruneX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接