我正在编写一个新闻报道器,它必须确定主图像(缩略图),给出一篇新闻文章的HTML文档。
换句话说,它基本上是同一个挑战:How does Facebook determine which images to show as thumbnails when posting a link?
有许多有用的技术(更喜欢更高的尺寸,更小的比例等),但有时在解析网页后,程序最终会得到一个相似大小的图像列表(其中一半是广告),它需要选择只有一个,它说明了文档中描述的故事。
在视觉上,当您打开a random news article时,主图片几乎总是位于顶部并被文本包围。如何实现HTML解析器(例如,使用xpath / nokogiri),它会找到这样的图像?
答案 0 :(得分:1)
除非您已经预先了解了网站的布局,否则没有好的方法可以从代码中确定这一点。
HTML和DHTML允许您使用CSS或JavaScript在页面上定位元素,并且可以在页面加载后执行此操作,这是Nokogiri无法访问的。
在可能能够在页面完全加载后使用其中一个Watir API执行此操作,但是,您再次确实需要知道网站使用的布局。广告可以位于HTML流中的任何位置,并在加载后在页面中移动,并且可以动态加载实际内容,并且可以动态更改其位置和大小。因此,您不能指望HTML中内容的位置是重要的,也不能指望HTML中的内容。 JavaScript或CSS不是你的朋友。
当我为网站分析编写蜘蛛和抓取工具时,我不得不处理同样的问题。因为我知道我要查看哪些网站,所以我会做一个快速预扫描并找到我的地标标签,然后为那些写一些CSS或XPath访问器。将URL保存在数据库中,您可以快速浏览页面,准确抓取您想要的内容。
如果不了解页面布局,您的代码完全受页面布局人员的支配,以及修改页面元素位置的任何内容。
基本上,您需要在代码中实现大脑内部的湿软件,以及以图形方式呈现页面的能力,以便您的代码可以对其进行分析。当您作为用户在浏览器中查看页面时,您正在使用视觉和上下文线索来查找重要内容。所有上下文信息都是缺少的,以及您需要编写的内容。
答案 1 :(得分:0)
如果我理解正确,那么解析页面的问题就更少了,但是实现了一个成功决定选择哪个图像的逻辑。
我认为第一步是决定哪些图像是新闻图像,哪些图像不是(例如广告)。
您可以通过读取图像URL(图像标记的src-attibute)并检查主机对文章主机的中间部分(在您的示例中为“nytimes”)应该是相同的。
第二步是决定哪一个是最重要的一个。为此,您可以使用文章中的图像大小,页面上的位置等。对于第2步,您必须尝试对大多数网站最有效的方法。调整你的算法,直到它为大多数新闻网站产生最好的结果。
希望这有帮助