DOMNodeList,xPath和PHP

时间:2011-12-06 16:08:27

标签: php html dom xpath screen-scraping

我在PHP中使用DOM和XPath解析HTML页面。

我必须从HTML中获取嵌套的<Table...></table>

我在浏览器中使用FirePath定义了一个指向

的查询
html/body/table[2]/tbody/tr/td[2]/table[2]/tbody/tr/td/table

当我运行代码时,它说DOMNodeList的长度为0.我的目标是将查询的<Table>作为一个字符串。这是PHP中的HTML抓取脚本。

以下是该功能。请帮助我如何提取所需的<table>

$pageUrl = "http://www.boc.cn/sourcedb/whpj/enindex.html";

getExchangeRateTable($pageUrl);


function getExchangeRateTable($url){
    $htmlTable = "";
    $xPathTable = nulll;
    $xPathQuery1 = "html/body/table[2]/tbody/tr/td[2]/table[2]/tbody/tr/td/table";

    if(strlen($url)==0){die('Argument exception: method call [getExchangeRateTable] expects a string of URL!');}

    // initialize objects
    $page = tidyit($url);
    $dom = new DOMDocument();
    $dom->loadHTML($page);
    $xpath = new DOMXPath($dom);

    // $elements is sppearing as DOMNodeList
    $elements = $xpath->query($xPathQuery1);

    // print_r($elements);
    foreach($elements as $e){
        $e->firstChild->nodeValue;  
    }

}

3 个答案:

答案 0 :(得分:3)

你试试这个

吗?
$dom = new domDocument; 
$dom->loadHTML($tes); 
$dom->preserveWhiteSpace = false; 
$tables = $dom->getElementsByTagName("table");
$rows = $tables->item(0)->getElementsByTagName("tr"); 
print_r($rows);

答案 1 :(得分:2)

从XPath查询中删除tbody - 在大多数情况下,它们会被您的浏览器插入,就像您要搜索的页面一样。

/html/body/table[2]/tr/td[2]/table[2]/tr/td/table

这很可能会奏效。

然而,使用不同的XPath可能更安全。以下XPath将根据它的文本内容选择第一个,然后选择tr的父级 - tbody或table:

//th[contains(text(),'Currency Name')]/parent::tr/parent::*

答案 2 :(得分:0)

xpath查询应该与前导/类似: -

/html/...