【问题标题】:Xpath query for finding nested element用于查找嵌套元素的 Xpath 查询
【发布时间】:2017-05-02 13:24:44
【问题描述】:

我很难弄清楚为什么我在这个基本的 2 部分 xpath 示例中没有得到任何结果,并且我使用 Chrome 的 XPath Helper 来确认第二个 xpath 查询确实正确并且确实返回我正在寻找的行。 有人可以解释为什么它会产生一个空的结果吗?在此示例中,我期望获得以 BNY 作为货币代码的表格行,即中国的人民币。一般来说,我想要请求的任何货币代码的表行数据,或者如果货币代码不在表中,则为空结果。

我还尝试在 html 加载后立即执行第二个 xpath 查询(绕过 xpath 查询以仅检索表),但这会返回所有行。我觉得我在这里做的事情根本上是错误的,但我无法发现它,因为 Chrome 的 XPath Helper 工作正常。

    $ccode = 'CNY';
    // Create a DOM object
    $html = new simple_html_dom();

    $url = "http://www.xe.com/symbols.php";
    // Load HTML from a URL
    $html->load_file($url);

    $table = $html->find('table.currencySymblTable', 0);        
    $xpathQuery = '//table/tbody/tr/td[2][text() = "'.$ccode.'"]/..';
    echo $xpathQuery;
    $tr = $table->find($xpathQuery);
    print_r($tr);

【问题讨论】:

  • 你能告诉使用你想要做什么..?
  • 我在帖子的末尾提供了几句话来解释我想要做什么,谢谢。
  • SimpleHtmlDom 不是真正的 W3C DOM 实现。不同的 API,没有 Xpath(只是 CSS 选择器的一个子集)。

标签: php xpath simple-html-dom


【解决方案1】:

你用错了currency code应该是CNY你用错了

XPATH 应该是这个table[@class="currencySymblTable"]/tr/td[2][text()="CNY"]/parent::tr

 <?php

ini_set('display_errors', 1);

libxml_use_internal_errors(true);
$htmlContent = file_get_contents("http://www.xe.com/symbols.php");
$object = new DOMDocument();
$object->loadHTML($htmlContent);
$xpath = new DOMXPath($object);
$xpathQuery = '//table[@class="currencySymblTable"]/tr/td[2][text()="CNY"]/parent::tr';
$results = $xpath->query($xpathQuery);
foreach ($results as $result)
{
    print_r($result);
}

输出:

DOMElement Object
(
    [tagName] => tr
    [schemaTypeInfo] => 
    [nodeName] => tr
    [nodeValue] => China Yuan RenminbiCNY¥¥165a5  info
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => (object value omitted)
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => tr
    [baseURI] => 
    [textContent] => China Yuan RenminbiCNY¥¥165a5    info
)

【讨论】:

  • 这实际上只是一个错字,CNY 也不起作用。还尝试了 /parent::tr 而不是 /.. 在查询结束时,仍然是空的。
  • 是的,它有效。我正在尝试使用 simple_html_dom,但这很好,我不在乎。谢谢!
  • /.. 最后也可以。不知道为什么 simple_html_dom 不能很好地使用 xpath 查询,因为我过去使用过它,但我真的需要最终结果,而不是我如何实现它。再次感谢。
  • @MikeT 最终结果是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多