我想知道是否有更好的方法从网页中提取信息而不是解析 HTML 以查找我正在搜索的内容。即:从“imdb.com”中提取电影评级
我目前正在使用 IndyHttp 组件来获取页面,并且我正在使用 strUtils 来解析文本,但内容是有限的。
我想知道是否有更好的方法从网页中提取信息而不是解析 HTML 以查找我正在搜索的内容。即:从“imdb.com”中提取电影评级
我目前正在使用 IndyHttp 组件来获取页面,并且我正在使用 strUtils 来解析文本,但内容是有限的。
我发现简单的正则表达式在处理好的网站时非常直观和简单,而 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 才能正确设置元素的样式。
抓取网站时,您不能依赖信息的可用性。IMDB 可能会检测到您的抓取并试图阻止您,或者他们可能会经常更改格式以使其更加困难。
因此,您应该始终尝试使用受支持的 API 或 RSS 提要,或者至少获得网站的许可来汇总他们的数据,并确保您遵守他们的条款。通常,您必须为此类访问付费。未经许可抓取网站可能会使您在几个法律方面(拒绝服务和知识产权)承担责任。
这是IMDB的声明:
您不得在我们的网站上使用数据挖掘、机器人、屏幕抓取或类似的在线数据收集和提取工具。
要回答您的问题,更好的方法是使用网站提供的方法。对于非商业用途,如果您遵守他们的条款,您可以直接下载 IMDB 数据库并使用那里的数据,而不是抓取他们的网站。只需经常更新您的数据库,这是比抓取网站更好的解决方案。您甚至可以围绕它包装自己的 Web API。评级可作为独立表格使用。
使用 HTML Tidy 将任何 HTML 转换为有效的 XML,然后使用 XML 解析器,可能使用 XPATH 或开发自己的代码(这就是我所做的)。
发布的所有答案都很好地涵盖了您的一般问题。我通常遵循类似于 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.