【问题标题】:XPath expression works in Chrome's developer tools feature and not in my codeXPath 表达式适用于 Chrome 的开发人员工具功能,而不是我的代码
【发布时间】:2014-07-17 18:11:15
【问题描述】:

我最近开始探索创建网络爬虫。我选择使用 PHP 并没有什么特别的原因。在 DOMXpath 内的 DOMDocument 中得到了我的 cURL 实例。而且我很高兴地发现使用 XPath 非常简单。

不幸的是,尽管我在 Chrome 的开发者工具功能中使用它时它的记录完美无缺,但它并不总是在我的代码中返回结果。相同的表达式将适用于前一种环境,而不适用于后者。

举个具体的例子,我无法抓住 YouTube 页面上视频下方的标题。

我的问题:为什么 XPath 表达式会在 Chrome 的开发人员工具功能中返回结果,而在我的代码中只得到一个零?这是我的东西和我尝试过的几个表达方式:

<?php

  $ch = curl_init("https://www.youtube.com/watch?v=SIPGkrlM3R8");
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  $curl = curl_exec($ch);

  $dom = new DOMDocument();
  @$dom->loadHTML($curl);

  $xpath = new DOMXpath($dom);


  $results = $xpath->query("//span[@id='eow-title']");
  //$results = $xpath->query("/html/body/div[2]/div[3]/div/div[5]/div/div[1]/div/div[1]/div[2]/div[1]/h1/span");

  foreach ($results as $result) {
    print_r($result->nodeValue . "<br>");
  }
?>

【问题讨论】:

    标签: php google-chrome xpath


    【解决方案1】:

    您已经走在正确的轨道上(无论如何您都正确地定位了元素)。使用(string) 进行类型转换:

    $contents = file_get_contents("https://www.youtube.com/watch?v=SIPGkrlM3R8");
    $dom = new DOMDocument();
    @$dom->loadHTML($contents);
    $xpath = new DOMXpath($dom);
    $results = trim((string) $xpath->query("//span[@id='eow-title']")->item(0)->nodeValue);
    echo $results; // Scraping Websites with PHP using DOMXpath and DOMDocument Part 2: Building an XPath Class
    

    Sample Demo

    【讨论】:

    • 首先,谢谢!尽管它告诉我无法获取非对象的节点值。我取下“->nodeValue”并做了 var_dump() 的事情,它说字符串没有长度。也许它是一个幽灵。 :)
    • @Savannah 我添加了完整代码和演示检查修订版
    • 啊,太好了!非常感谢您帮助我解决这个问题。
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多