如何使用XPath查询动态类名

时间:2017-04-08 03:04:24

标签: php xpath web-scraping domdocument

下面是一个从元素中抓取单个值的工作代码(基本上是抓住当前的汇率值。

$target_url = file_get_contents('http://www.bsp.gov.ph/statistics/sdds/exchrate.htm');
$new_dom_doc = new DOMDocument();
libxml_use_internal_errors(TRUE); //disable libxml errors
if(!empty($target_url)){ //check if target_url is actually returned
    $new_dom_doc->loadHTML($target_url);
    libxml_clear_errors(); //remove errors from yucky target_url    
    $xpath = new DOMXPath($new_dom_doc);
    echo $xpath->query('//td[@class="xl1257110"]')->item(0)->nodeValue;        
}

它的工作正常但唯一的问题是类名//td[@class="xl1257110"]不是静态的,所以每当类名在一段随机时间后变为随机值时代码就会中断。

我有什么想法可以绕过这个问题吗?

1 个答案:

答案 0 :(得分:0)

好吧,使用另一个标记。例如,SYMBOL文本和后面的表格单元格的位置。

$document = new DOMDocument();
$document->loadHTML($html);
$xpath = new DOMXpath($document);

$expression = "string(//td[text() = 'IDR']/following-sibling::td[2])";

var_dump(
  $xpath->evaluate($expression)
);

输出:

string(8) "0.000068"

//td[text() = 'IDR']将获取包含文字内容IDR的表格单元格。 following-sibling::选择具有相同父节点的以下节点,因此following-sibling::td是以下td节点。 [2]是一个职位(从1开始)。

string()将结果列表中的第一个节点转换为字符串。您将获得空列表的空字符串。这仅适用于DOMXpath::evaluate(),而不适用于DOMXpath::query()