从网络delphi中提取信息的最佳方法

时间:2012-01-13 00:03:44

标签: delphi parsing html-content-extraction information-extraction

我想知道是否有更好的方法从网页中提取信息,而不是解析我正在搜索的HTML。即:从'imdb.com'中提取电影评级

我目前正在使用IndyHttp组件来获取页面,我正在使用strUtils来解析文本,但内容有限。

6 个答案:

答案 0 :(得分:7)

我发现简单的正则表达式在处理好的网站时非常直观和简单,而且IMDB是一个很好的网站。

例如,IMDB电影HTML页面上的电影评级位于<DIV> class="star-box-giga-star"。使用正则表达式提取非常容易。以下正则表达式将从原始HTML提取电影评级到捕获组1:

star-box-giga-star[^>]*>([^<]*)<

它并不漂亮,但它确实起作用了。正则表达式查找“​​star-box-giga-star”类ID,然后查找终止>的{​​{1}},然后捕获所有内容,直到以下DIV。要创建这样的新正则表达式,您应该使用允许检查元素的Web浏览器(例如Crome或Opera)。使用Chrome,您只需查看网页,右键单击要捕获的元素并执行<,然后四处查找可用于创建良好正则表达式的易于识别的元素。在这种情况下,Inspect element类显然很容易识别!您通常可以在良好的网站上找到这样的可识别元素没有问题,因为优秀的网站使用CSS和CSS需要"star-box-giga-star"ID'才能正确设置元素的样式。

答案 1 :(得分:3)

处理 RSS Feed 更为舒适。

截至发布时,网站上唯一可用的RSS源是:

  • 生于此日期
  • 死于此日期
  • 每日民意调查

但是,您可以通过与help desk取得联系来致电添加新内容。

有关RSS Feed处理的资源:

答案 2 :(得分:3)

在抓取网站时,您无法依赖信息的可用性。 IMDB可能检测到您的抓取并试图阻止您,或者他们可能经常更改格式以使其更难。

因此,您应该始终尝试使用受支持的API或RSS源,或至少获得网站的许可来汇总其数据,并确保您遵守其条款。通常,您必须为此类访问付费。在未经许可的情况下搜索网站可能会使您在几个法律方面(拒绝服务和知识产权)承担责任。

这是IMDB的statement

  

您不得使用数据挖掘,机器人,屏幕抓取等   我们网站上的在线数据收集和提取工具。

要回答您的问题,更好的方法是使用网站提供的方法。对于非商业用途,如果您遵守terms,则可以download the IMDB database directly并使用其中的数据而不是抓取他们的网站。只需经常更新您的数据库,这是一个比抓取网站更好的解决方案。您甚至可以围绕它包装自己的Web API。评级可作为独立表格提供。

答案 3 :(得分:2)

使用HTML Tidy将任何HTML转换为有效的XML,然后使用XML解析器,可能使用XPATH或开发自己的代码(这就是我所做的)。

答案 4 :(得分:2)

所有发布的答案都涵盖了您的通用问题。我通常遵循类似于Cosmin详细描述的策略。我使用wininet和regex来满足我的大部分Web提取需求。

但是,让我在提取imdb资格的具体子问题上加上我的两分钱。 IMDBAPI.COM提供了一个返回json代码的查询接口,这对于这种类型的搜索非常方便。

因此获得imdb评级的一个非常简单的命令行程序将是......

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm:string;h:string):string;
 var r:integer;
 begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then 
    result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
  else
    result:='N/A';
 end;

var h:string;
begin
  h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
  writeln(ExtractJsonParm('Rating',h));
end.

答案 5 :(得分:0)

如果您抓取的网页是有效的XML,我使用SimpleXML来提取信息。效果很好。

<强>资源: