PHP DOMXPath 使用完整路径获取值 - 无 ID

标签 php html xpath domdocument domxpath

我试图通过直接 XPath 获取元素的值,因为该元素没有 ID。

$dom = new DOMDocument();
@$dom->loadHTML($rawHTML);
$finder = new DOMXPath($dom);

//this works well
$elements = $finder->query("//*[@id='html-ID-value']")->item(0);

//this does Not work
$testPath = '/html/body/div[2]/div[1]/div[7]/div[1]/div/div/table/tbody/tr[6]/td';

//tested several different ways to fetch the data
$elements = $finder->query("//*[@xpath='" . $testPath . "']");
$elements = $finder->query( $testPath );
$elements = $finder->evaluate( $testPath );

我正在通过 Firefox 生成测试直接 XPath。我使用检查器突出显示一个元素,然后右键单击它并选择复制 XPath。

使用 ID 时,代码运行良好,但我无法使用直接 XPath 获取数据。

我正在寻找的元素没有任何可搜索的唯一值。我想使用直接 XPath 而不是遍历复杂的 DOM 对象,因为我需要这段代码在许多不同的路径上进行操作,这些路径都将不同。

任何帮助将非常感激。

谢谢。

========== 编辑/更新 ====================================== ============

非常感谢您的回复。我添加了一个更完整的例子来说明我遇到的问题。在这个例子中,我使用谷歌的主页并通过 ID 获取数据,然后通过完整的 XPath 获取另一个数据。 ID 获取良好,完整的 XPath 失败。

我还尝试了“评估”方法。

我无法减少或简化完整的 XPath 数据,因为这只是一个例子。如果没有可获取的 ID,则用户将生成此路径。所以路径每次都会根据用户的需要而不同。

我确实同意浏览器上获取的路径在 PHP 中解析后可能有所不同,这可能是导致问题的原因。我不知道我将如何解决这个问题。
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/bot.html");
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16" );

curl_setopt($ch, CURLOPT_URL, "https://www.google.com/" );
$result = curl_exec($ch);
curl_close($ch);

$dom = new DOMDocument();
@$dom->loadHTML($result);
$finder = new DOMXPath($dom);

// get "google offered in:" text by id ----------------------------------------------
$elements = $finder->query("//*[@id='SIvCob']")->item(0);

$results = '';

if ($elements) {
    $results = $elements->firstChild->textContent;
} else {
    $results = "";
}

print('google language: [' . $results . "] <br>"); //returns "Google offered in: " as expected

// get "Store" text by full xpath, top left corner of page -------------------------------------------
$xpath = "/html/body/div/div[3]/div[1]/a[2]"; //path generated by firefox inspector, right clicking on element

$elements = $finder->query($xpath)->item(0);

$results = '';

if ($elements) {
    $results = $elements->firstChild->textContent;
} else {
    $results = "";
}

print('google store: [' . $results . "] <br>");  //returns nothing
print_r($elements); //returns nothing

//trying again ----------------------------------------------------------------------------

$result = $finder->evaluate($xpath);
foreach ($result as $node) {
    var_dump($node); //returns nothing
}

最佳答案

Firefox 中解析的 DOM 不一定与原始源相同。 Firefox 修改/修复文档。例如,它添加了 tbody元素。

所以试试吧:

$expression = '/html/body/div[2]/div[1]/div[7]/div[1]/div/div/table/tr[6]/td';
$result = $finder->evaluate($expression);
foreach ($result as $node) {
  var_dump($node);
}

但是我建议使用其他东西作为条件来使表达式不那么复杂。例如 table 周围的 div 的 class 属性。
//div[@class="aClass anotherClass"]/table/tr[6]/td

还是第一个th的内容表内:
//table[contains((tr/th)[1], "Column Header")]/tr[6]/td

关于PHP DOMXPath 使用完整路径获取值 - 无 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59349019/

相关文章:

javascript - 返回被点击元素的背景颜色js

xml - 列出或计算从当前节点到每个叶节点的具有某些属性的路径

python - 无法选中复选框出现超时异常

php - 如何检测 PHP 和 PCRE 中的 Unicode 版本?

php - 生成单场淘汰赛

javascript - 更改已应用样式的 html 表格行颜色

java - 如何使用 Selenium 和 Java 单击文本为 Ok 的元素

php - 遍历获取的 SQL 数据

php - Symfony2 - 更改现有用户的编码器

jquery - 基于 CSS 表格的布局行未扩展 100% 宽度