在PHP中获取XPath属性值

34
如何提取HTML标签的值?
HTML:

可能是重复的问题:
如何使用PHP的DOM解析器从XML中提取节点属性

<input type="hidden" name="text1" id="text1" value="need to get this">

PHP:

$homepage = file_get_contents('http://www.example.com');
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
@$doc->loadHTML($homepage);
$xpath = new DOMXpath($doc);
$filtered = $xpath->query("//input[@name='text1']");

如何使value变成"需要获取这个"

更新:

我已经让它正常工作,并希望它也能帮助其他人。在上面的代码之后,我通过以下方式获得了该值:

echo $filtered->item(0)->getAttribute('value');

你需要通过 foreach ($filtered as $element) { ... } 循环遍历过滤后的元素 $filtered,并自行检查节点值/属性。 - Smamatti
6
一种选择是较少使用的evaluate()方法,它将返回文本或空字符串:$xpath->evaluate('string(//input[@name="text1"]/@value)'); - salathe
4
这并不是另一个问题的完全复制。这个问题提供了一种跨环境的XPath解决方案,而另一个问题则是针对PHP的特定解决方案。 - Factor Mystic
要使用 evaluate,请参见 https://dev59.com/L2w15IYBdhLWcg3wG4EJ#45010743。 - Peter Krauss
3个回答

40
XPath可以使用$xpath->query("//input[@name='text1']/@value");来获取值属性。然后,您可以迭代属性节点的节点列表并访问每个属性节点的$value属性。

2
请关闭投票。这是一个重复的问题。 - Gordon

14

9
我不熟悉PHP的语法,但是为了选择"value"属性,您可以使用以下xpath:
//input[@name='text1']/@value

然而XPath不返回字符串,它返回节点。您需要获取节点的nodeValue,因此如果PHP按照惯例操作,那么代码应该是:

 $xpath->query("//input[@name='text1']/@value")->item(0).nodeValue;

为了学习目的,请记住您始终要检查 nodeValue 属性。因此,如果您想要同一元素的名称,您将使用:

 $xpath->query("//input[@name]/@name")->item(0).nodeValue;

在查询 nodeValue 属性之前,您可能需要确保查询返回的值不为 null。


2
不起作用。错误 Undefined property: DOMNodeList::$value - Khurshid Alam
2
这对我有用:$res = $xpath->query("//input[@name]/@name"); echo $res->item(0)->nodeValue; - TomoMiha
最简单的方法是使用 evaluate,请参见 https://dev59.com/L2w15IYBdhLWcg3wG4EJ#45010743 - Peter Krauss

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