【问题标题】:Simple PHP Screen Scraping Function简单的 PHP 屏幕抓取功能
【发布时间】:2010-08-03 19:12:16
【问题描述】:

我正在尝试使用 WordPress 进行自动博客(即 RSS 驱动的博客发布),所缺少的只是使用 RSS 的 URL 链接到的内容自动填充帖子内容的组件(RSS 无关紧要)到解决方案)。

使用标准 PHP 5,我如何创建一个名为 fetchHTML([URL]) 的函数,该函数返回位于 <body>...</body> 标签之间的网页的 HTML 内容?

如果有任何先决条件“包含”,请告诉我。 谢谢。

【问题讨论】:

  • 会让网络变得更垃圾吗?

标签: php screen-scraping blogs


【解决方案1】:

好的,这是一个 DOM 解析器代码示例。

<?php

function fetchHTML( $url )
  {

  $content = file_get_contents($url);

  $html=new DomDocument();
  $body=$html->getelementsbytagname('body');
  foreach($body as $b){ $content=$b->textContent; break; }//hmm, is there a better way to do that?
  return $content;
  }

【讨论】:

  • 以前从未见过 DomDocument()!我一定要检查一下。这让我只想使用 jQuery 来解决...$( &lt;?= $content ?&gt; ).find( 'body' ).html();heh
  • @hookedonwinter ha...我猜这会起作用!如果你在浏览器中打开它,嗯......这提醒了我,实际上有一个叫做 phpquery code.google.com/p/phpquery 的东西非常酷!
  • JL 你现在已经给了我足够的下周学习时间。谢谢!
【解决方案2】:

假设它将始终是 &lt;body&gt; 而不是 &lt;BODY&gt;&lt;body style="width:100%"&gt; 或除 &lt;body&gt;&lt;/body&gt; 之外的任何内容,并注意您不应该使用正则表达式来解析 HTML,即使我快到了,来吧:

<?php

function fetchHTML( $url )
{
    $feed = '<body>Lots of stuff in here</body>';

    $content = file_get_contents( $url );

    preg_match( '/<body>([\s\S]{1,})<\/body>/m', $content, $match );

    $content = $match[1];

    return $content;


} // fetchHTML
?>

如果你echo fetchHTML([some url]);,你会得到body标签之间的html。

请注意原始警告。

【讨论】:

  • 非常简单 - 很好的答案。以及如何检查实现 标记的不同方式(如您在上面强调的那样)?没有不区分大小写的正则表达式开关吗?
  • 有。它只是 i (就在模式末尾的 m 之前)。但是例如,stackoverflow.com 将不起作用,因为开始正文标记是 &lt;body class="home-page"&gt;
  • 喜欢“照我说的做,而不是照我做”的警告。 ;)
  • @Alex aka “我不知道如何正确执行此操作,但我知道。所以.. 祝你好运”
  • 既然你知道正则表达式很糟糕,为什么不给出一个 DOM 解析器的答案呢?
【解决方案3】:

我认为你最好使用像 SimpleDom 这样的类 -> http://sourceforge.net/projects/simplehtmldom/ 来提取数据,因为你不需要编写如此复杂的正则表达式

【讨论】:

  • 谢谢。不错的库,使用直观,它包括类似 jquery 的选择器。截至 2013 年年中,它似乎仍然是一个活跃的项目。
猜你喜欢
  • 2011-06-03
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多