【问题标题】:Scrape data from a web page that is NOT well formed从格式不正确的网页中抓取数据
【发布时间】:2012-09-24 21:47:35
【问题描述】:

我正在尝试从网页中抓取数据。网页可以是任何页面。例如,我正在使用curl 抓取http://www.google.com/。它给出了很多警告,却什么也没做。警告在第 30 行:

警告:SimpleXMLElement::__construct(): 在 C:\wamp\www\nbacurl\index.php

而且这个错误重复了好几次。

我听说过 simplehtmldom ,我下载了它但不知道如何使用它。我有页面要解析,但我找不到出路。这是一个非常简单但不起作用的代码。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com' );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec ($ch);

$xml = new SimpleXMLElement($contents);
echo '<pre>' , print_r($xml) , '</pre'>; 

【问题讨论】:

  • 我没有看到你使用 simplehtmldom 很难......无论如何,如果该类失败(它不是最好的)尝试phpQuery
  • 谢谢达米恩,我试图使用“simplehtmldom”,但它不适合我。所以我转向了非常基本的,它有 4 条卷曲线和几条 xml 线。
  • 请帮我一个忙,因为我是 phpQuery 的新手,它实际上是做什么的?它就像jQuery,在哪里制作函数和调用内置函数?或者是别的什么?谢谢
  • 怎么不工作了?你仔细阅读过他们的 API 吗? SimpleXMLElement 不适合解析(格式错误的)html 文档。至于phpQuery,为什么不直接看页面呢? :) 无论如何,它是一个 DOM 解析器,带有类似 jQuery 的选择器。它比 simplehtmldom 简单快捷,我(几乎)两者都没有遇到过问题
  • 它不起作用 :) 所有先决条件均已验证。 curl 已安装,ini 文件已检查。我现在正在研究你建议的 phpQuery,希望我能从中得到一些东西:)

标签: php curl web-scraping


【解决方案1】:

不要尝试使用 SimpleXMLElement 解析它,也许可以尝试使用 DOMDocument 或其他更适合 HTML 解析的解决方案。

【讨论】:

  • 感谢 Mike 抽出宝贵时间,我会研究一下 DOMDocument 看看它是如何工作的。
【解决方案2】:

希望没有人会因为“无关紧要”而投反对票,但我使用mechanize 抓取网页并发现它非常直观和有效。小api很容易学习。

我刚刚看到您使用的是 php 而不是 python。 Mechanize 是一个 python/perl 库,所以这里可能不相关。

【讨论】:

  • 感谢您抽出宝贵时间,我正在调查您提到的刮擦。我希望我能找到我正在寻找的解决方案。
  • 糟糕!我在想它说的是python。因此,您可以使用混合选项从 php 文件执行 python 脚本。否则这个建议不会很有价值。
  • 是的 :) 我使用的是 php,而不是 python...但是感谢您抽出时间来发帖,非常感谢 :)
【解决方案3】:

在启用恢复的情况下使用 DOMDocumentloadHTMLloadXML。前者可能是你真正想要的。

<?php
$doc = new DOMDocument();
$doc->loadHTML($contents);

...
?>

见:http://www.php.net/manual/en/class.domdocument.php#domdocument.props.recover

<?php
$doc = new DOMDocument();
$doc->recover = TRUE;
$doc->loadXML($contents);

...
?>

【讨论】:

  • 感谢您的宝贵时间,我已经测试了您的解决方案,但仍然没有成功,它正在等待;。代码是 $content = file_get_contents('google.com/'); $doc = 新的 DOMDocument(); $doc->恢复=真; echo '
    ' , print_r($doc->loadHTML($content)) , '
    ';警告:DOMDocument::loadHTML(): htmlParseEntityRef: 期待 ';'在实体中,行:40(11 次)
  • 使用您的 curl 代码获取内容。这只是一个警告。你的 DOM 应该存在。使用 DOMDocument->saveXML(); 获取它你不能使用 print_r。
  • 现在显示Moved 302 文档已移至此处。单击它时,它会重定向到网页。我怎样才能从中得到HTML/XML :( ?
  • saveXML() 的返回类型是 XML。但如果我把它写在文件上,它会写 1.
【解决方案4】:

也许可以试试ScriptableBrowser(对于 PHP)。我个人在 python 中使用 Mechanize 和 BeautifulSoup。

【讨论】:

  • ScriptableBrowser 在 PHP 中。
  • 对不起,我认为是错误的。我会调查一下,谢谢分享:)
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多