【问题标题】:Dom and XPath scraping - What wrong here?Dom 和 XPath 抓取 - 这里有什么问题?
【发布时间】:2011-04-17 04:51:58
【问题描述】:

我需要从互联网上的网页中抓取一段文本,我正在使用 dom 和 xpath 来查找数据,但我似乎无法选择我需要的确切信息。到目前为止,这是我的代码,问题出在 item(0)->nodeValue 部分 - 这适用于我在另一个页面上的其他抓取,但不是这个。

$argos_html = file_get_html('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext%3EIPOD+TOUCH.htm');

$dom_argos= new DOMDocument();
$dom_argos->loadHTML($argos_html);

$xpath_argos = new DOMXpath($dom_argos);

$expr_currys = "/html/body/div[4]/div[3]/form/div[2]/div/div[5]/ul/li[3]/span";
$nodes_argos = $xpath_argos->query($expr_argos);

$argos_stock_data = $nodes_argos->item(0)->nodeValue;

谁能告诉我哪里出错了?因为我总是收到一个错误,这与 ->item(0)->nodeValue;部分,但是,如果我将其注释掉,则没有错误,但是根本没有收集到任何数据...

应该只是->nodeValue;

我知道这可能与页面结构有关,但我对这一切都不熟悉! 谢谢

【问题讨论】:

  • 这个错误可能是因为你没有选择任何元素:没有节点时你不能调用nodeValue!您的 XPath 中可能有一个错误——它非常复杂,所以我并不感到惊讶。看看你是否能找到一种更简单的方法来指定你想要的元素。元素 ID 将是一个很好的起点。
  • 如果您遇到错误,请告诉我们它是什么。它可能对你没有任何意义,但它可能对本论坛上的某个人有意义。

标签: php dom xpath


【解决方案1】:

运行你的代码,我首先得到:

Notice: Undefined variable: expr_argos
Warning: DOMXPath::query() [domxpath.query]: Invalid expression

因此,首先,请确保您使用的 XPath 查询有效——例如,您应该有这个:

$nodes_argos = $xpath_argos->query($expr_currys);

而不是你目前拥有的:

$nodes_argos = $xpath_argos->query($expr_argos);


然后,您会收到以下错误:

Notice: Trying to get property of non-object

在下面一行:

$argos_stock_data = $nodes_argos->item(0)->nodeValue;

基本上,这意味着您正在尝试读取不是对象的属性nodeValue$nodes_argos->item(0);

我猜您的 XPath 查询无效;因此,对 xpath() 方法的调用不会返回任何有趣的内容。

你应该检查你的(有点太长,不容易理解) XPath 查询,确保它与你的 HTML 页面中的某些内容相匹配。

【讨论】:

  • 为您的回复干杯,哦不,我又复制粘贴了,这就是咖喱在里面的原因,应该都是 argos。我有多个在线零售商,我正在努力争取。感谢您的解释,我会继续编写更多代码!
【解决方案2】:

当我在 Firefox 中使用时,您的 XPath 很好,但它不适用于 DOM,这并不奇怪。我假设您从某种能够返回某些元素的路径的浏览器插件中获得了 XPath。但是,您不应信任浏览器插件返回的 XPath,因为浏览器会通过 JavaScript 修改 DOM 并在必要时添加隐含值。请改用原始源代码。

您的 XPath 在 Firefox 中评估为“两天内送货上门”,这不是我在名为“stock_data”的变量中所期望的。但无论如何,应该这样做:

$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->loadHTMLFile('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext%3EIPOD+TOUCH.htm');
libxml_clear_errors();

$xpath = new DOMXpath($dom);
$nodes = $xpath->query(
    '/html/body//div[@id="deliveryInformation"]/ul/li[@class="home"]/span'
);
echo $nodes->item(0)->nodeValue; // "Home delivery within 2 days"

【讨论】:

  • 你说得对,我用的是插件!还有我忘记将其更改为 argos 的变量,currys 是我试图从中获取数据的另一个零售商。此外,我需要一种检查产品是否有库存的方法,因此我想如果产品有库存,零售商将如何在他们的网站上说,并使用 IF 语句进行检查,所以如果最终验证不包含“送货上门....”然后它将返回为假/无库存!我对这一切都很陌生,并且承担了一个具有挑战性的项目!无论如何,非常感谢您的回复,现在开始编码!
  • @James 请查看您迄今为止给出的答案,要么接受解决您问题的答案,要么更新并改进您的问题,以指出为什么这些都不能解决您的问题,所以人们有一个有机会改进他们的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多