我想知道是否有更好的方法从网页中提取信息,而不是解析我正在搜索的HTML。即:从'imdb.com'中提取电影评级
我目前正在使用IndyHttp组件来获取页面,我正在使用strUtils来解析文本,但内容有限。
答案 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)