我正在尝试通过直接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对象,因为我需要此代码在许多不同的不同路径上进行操作。
任何帮助将不胜感激。
谢谢。
==========编辑/更新================================== ==============
非常感谢您的答复。我添加了一个有关问题的更完整示例。在此示例中,我使用Google的主页,并按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);
}
但是我建议使用其他条件作为使表达式不太复杂的条件。例如,表格周围div的class属性。
//div[@class="aClass anotherClass"]/table/tr[6]/td
或表中第一个th
的内容:
//table[contains((tr/th)[1], "Column Header")]/tr[6]/td