5

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

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

4

6 回答 6

7

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

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

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

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

于 2012-01-13T08:12:35.307 回答
3

处理RSS 提要更舒服。

截至发稿时,网站上唯一可用的 RSS 提要是:

  • 在这个日期出生
  • 在这个日期去世
  • 每日民意调查

但是,您可以通过联系服务台来要求添加一个新的。

RSS 提要处理资源:

于 2012-01-13T03:51:40.537 回答
3

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

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

这是IMDB的声明

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

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

于 2012-01-13T13:52:46.430 回答
2

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

于 2012-01-13T05:41:55.527 回答
2

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

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

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

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm,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.
于 2012-01-13T12:02:40.610 回答
0

如果您正在抓取的页面是有效的 XML,我会使用它SimpleXML来提取信息。效果很好。

资源:

于 2012-01-13T00:10:03.530 回答