【问题标题】:php xpath returning entire htmlphp xpath 返回整个 html
【发布时间】:2026-01-25 01:40:01
【问题描述】:

为什么这会返回整个 html 文档,而不仅仅是来自包含“H+R+E”的节点的值?

html 示例:

<tr class="linesAlt1">
        <td>04:10 PM</td><td style="width:53%;">3055&nbsp;Over</td><td style="width:22%;">3&nbsp;H+R+E&nbsp;&nbsp;+146</td>
    </tr>

我只想得到"3&amp;nbsp;H+R+E&amp;nbsp;&amp;nbsp;+146"。但这会转储所有 html。

<?php

$url = 'http://www.pinnaclesports.com/ContestCategory/MLB+Propositions/July+13~2C~+2012/Lines.aspx';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$html = curl_exec($ch);
curl_close($ch);

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

foreach ($xpath->query("//table/tr/td[contains(., 'H+R+E')]") as $textNode){
  echo $textNode->nodeValue."\n";
}


?>

【问题讨论】:

标签: php html xpath curl screen-scraping


【解决方案1】:

curl_exec 默认打印到STDOUT,这就是您所看到的。换句话说,您没有在$html 中捕获任何输出(或在该循环中打印任何内容)。首先,你需要重定向输出:

curl_setopt($ch, CURLOPT_FILE, fopen('php://stdout', 'w'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$html = curl_exec($ch); 

解决该问题后,我查看了提供的 URL 的来源,但在其中的任何地方都找不到该文本 -- H+R+E。它有一张桌子,但没有那个内容。您正在寻找不存在的东西。

要证明它现在可以正确检索文件,请尝试以下完整示例:

$url = 'http://www.pinnaclesports.com/ContestCategory/MLB+Propositions/July+13~2C~+2012/Lines.aspx';
$ch = curl_init();
curl_setopt($ch, CURLOPT_FILE, fopen('php://stdout', 'w'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$html = curl_exec($ch); 
curl_close($ch);

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

foreach ($xpath->query("//table") as $table){
      echo "[" . $table->nodeValue . "\n";
}

...产生以下输出(loadHTML 警告省略):

[ 客户编号: 密码:

有关设置 cURL 选项的更多信息:

【讨论】:

  • 谢谢。我在发布后意识到来源是一个不好的例子,因为他们在晚上删除了该信息......不知道我会如何解释这一点,除非我只是从今天早些时候复制了整个来源。