【问题标题】:php read html and handle double id-appearancephp读取html并处理双id-appearance
【发布时间】:2020-08-17 16:31:05
【问题描述】:

对于我的项目,我正在阅读一个使用相同 ID 两次的外部网站。我无法改变这一点。

我需要该 ID 第二次出现的内容,但我的代码只生成第一个,而看不到第二个。 $data 的计数结果为 1 但不是 2。 我很绝望。有谁知道如何访问第二个 ID“小时”?

<?PHP
  $url = 'myurl';
  $contents = file_get_contents($url);
  $dom = new DOMDocument();
  libxml_use_internal_errors(true);
  $dom->loadHTMLFile($url);
  $data = $dom->getElementById("hours");
  echo $data->nodeValue."\n";
  echo count($data);
?>

【问题讨论】:

  • getElementById 始终返回单个节点。 PHP 的 DOMDocument 没有提供通过 id 属性获取多个节点的方法,但您可以使用 DOMXPath 编写查询

标签: php html parsing get


【解决方案1】:

正如@rickdenhaan 所指出的,getElementById 总是返回一个元素,它是第一个具有特定值id 的元素。但是,您可以使用 DOMXPath 查找具有给定 id 值的所有节点,然后选择您想要的节点(在此代码中,它将找到第二个节点):

$url = 'myurl';
$contents = file_get_contents($url);
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
$xpath = new DOMXPath($dom);
$count = 0;
foreach ($xpath->query("//*[@id='hours']") as $node) {
    if ($count == 1) echo $node->nodeValue;
    $count++;
}

正如@NigelRen 在 cmets 中指出的那样,您可以通过直接选择 XPath 中的第二个输入来进一步简化此操作,即

$node = $xpath->query("(//*[@id='hours'])[2]")[0];
echo $node->nodeValue;

Demo on 3v4l.org

【讨论】:

  • 您可以稍微缩短它,使用 XPath 仅获取第二个项目 - $node = $xpath-&gt;query("(//*[@id='hours'])[2]")[0];echo $node-&gt;nodeValue; - 查看 stackoverflow.com/questions/4007413/…
  • @NigelRen 感谢您的参考。这确实使它更简单,我已经用那个替代方法更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2015-03-21
  • 1970-01-01
  • 2020-09-10
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多