尝试XPath查询未显示任何结果

时间:2017-01-01 04:05:19

标签: php xml dom xpath

我目前在幻想体育网站上工作,我希望能够从其他网站获取基本统计数据。 (我没有太多的XML经验或从其他网站提取数据)。

我检查了元素以获得它的XPath:

Getting XPath

这给了我://*[@id="cp1_ctl01_pnlPlayerStats"]/table[1]/tbody/tr[4]/td[18]

我已经研究了几种尝试提取信息的方法并想出了这个:

Code 1

但我最终在我的网站中的表格中找到了空元素:

enter image description here

这是我的代码:

        $doc = new DOMDocument();
        @$doc->loadHTMLFile($P_RotoLink);

        $xpath = new DOMXpath($doc);

        $elements = $xpath->query('//*  [@id="cp1_ctl01_pnlPlayerStats"]/table[1]/tbody/tr[4]/td[18]');

        if (!is_null($elements)) {
            foreach ($elements as $element) {
                $nodes = $element->childNodes;
                foreach ($nodes as $node) {
                    echo $node->nodeValue. "\n";
                }
            }
        }

我尝试过的一些事情让我误以为,任何时候我终于通过它们或压制它们我都会得到空洞的内容。我尝试了很多不同的格式,但似乎都没有给我所需的内容。

编辑:这里是源HTML,我想抓住td(13.0)中的值。

enter image description here

编辑2:这就是我现在正在尝试的事情:

$html = file_get_contents($P_RotoLink);

$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->loadHTML($html);
libxml_use_internal_errors(false);
$xpath = new DOMXpath( $doc);

foreach ($xpath->query('//*[@id="cp1_ctl01_pnlPlayerStats"]/table//tr[4]/td[18]') as $node) {
                                        $ppg = substr($node->textContent,0,3);
                                        echo $ppg;
                                    } 

enter image description here

1 个答案:

答案 0 :(得分:0)

问题是屏幕截图中的表没有tbody节点,但您的XPath表达式包含tbody,导致DOMXPath::query返回空节点列表。我建议忽略tbody并仅使用//tr获取行。

示例

$html = <<<'HTML'
<div id="cp1_ctl01_pnlPlayerStats">
  <table>
    <tr></tr>
    <tr>
      <td><span>0.9</span>1.0<span>3.0</span></td><td>2.0</td>
    </tr>
  </table>
</div>
HTML;

$doc = new DOMDocument();
$doc->loadHTML($html);
$xp = new DOMXPath($doc);
$expr = '//*[@id="cp1_ctl01_pnlPlayerStats"]/table//tr[2]/td[1]/text()';
$td = $xp->query($expr);
if ($td->length) {
  var_dump($td[0]->nodeValue);
}

输出

string(3) "1.0"

text()函数选择上下文节点的所有文本节点子节点。