1

你将如何解决这个问题?

您正在抓取博客的 HTML。博客的一些 HTML 是博客文章,一些是格式、侧边栏等。如果有的话,您希望能够分辨 HTML 中的哪些文本属于哪个文章(即永久链接)。

我知道你在想什么:你可以只看 RSS 而完全忽略 HTML!但是,RSS 通常只包含非常短的摘录或删除您可能感兴趣的链接。您希望通过同时使用同一页面的 HTML 和 RSS 从本质上打败 RSS 的摘录。

RSS 条目如下所示:

标题
帖子正文摘录
永久链接

HTML 格式的博客文章如下所示:

标题(可能被永久链接包围)
...
永久链接,也许
...
帖子正文
...
永久链接,也许

因此 HTML 页面包含相同的字段,但预先不知道永久链接的位置,并且这些字段将被一些主要是 HTML 和空白的噪声文本分隔,但也可能包含一些额外的元数据,例如“由 Johnny 发布"或日期或类似的东西。如下所述,文本在 HTML 和 RSS 中也可能略有不同。

附加规则/注意事项:

  • 标题可能不是唯一的。这种情况发生的频率比您想象的要多。我见过的例子:“周一综述”、“TGIF”等。
  • 标题甚至可以留空。
  • RSS 中的摘录也是可选的,但假设必须至少有非空白摘录或非空白标题
  • RSS 摘录可能包含完整的帖子内容,但更有可能包含帖子正文开头的简短摘录
  • 假设永久链接必须是唯一的,并且在 HTML 和 RSS 中必须相同。
  • RSS 和 HTML 中的标题、摘录和帖子正文的格式可能略有不同。例如:
    • RSS 可能在标题或正文中去除了 HTML,或者在 HTML 页面上可以添加更多 HTML(例如用某些东西包围文章正文的第一个字母)或格式可能略有不同
    • 文本的编码可能略有不同,例如在 RSS 中是 utf8,而在 HTML 中的非 ascii 字符总是使用 & 号编码。但是,假设这是英文文本,非 ascii 字符很少见。
    • 可能存在编码错误的 Windows-1252 可怕性。对于像弯引号这样的符号字符,这种情况经常发生。但是,可以安全地假设大部分文本都是 ascii。
    • 可能会在任何一个方向上折叠,尤其是在标题中。因此,他们可以将 HTML 页面中的标题全部大写,但不能在 RSS 中。
  • 假定 RSS 提要和 HTML 页面中的条目数不同。要么有更多或更少的旧条目。我们只能期望只获得出现在两者中的那些帖子。
  • RSS 可能会滞后。HTML 页面中可能有一个新条目尚未出现在 RSS 提要中。如果 RSS 通过 Feedburner 进行联合,则可能会发生这种情况。同样,我们只能期望解析那些同时出现在 RSS 和 HTML 中的帖子。
  • 帖子的正文可以很短也可以很长。

100% 准确率不是限制。但是,越准确越好。

嗯,你会怎么做?

4

2 回答 2

1

我会为每个主要的博客引擎创建一个刮板。从每页一篇文章的正文开始。

如果幸运的话,引擎会提供合理的 XHTML,所以你可以想出一些有用的 XPath 表达式来获取与文章对应的节点。如果不是,那么恐怕是TagSoupTidy将其强制转换为格式良好的 XML。

从那里,您可以查找元数据和全文。这应该安全地删除页眉/页脚/侧边栏/小部件/广告,尽管可能会留下嵌入的对象等。

将页面分割成文章元数据、文本、评论等,并将其放入相当合理的 RSS/Atom 项目中也应该相当容易 (TM)。

这将是获取 RSS 提要(非全文)并将其转换为全文(通过遵循官方 RSS 中给出的永久链接)的基础。

一旦你有了一个博客引擎的爬虫,你就可以开始考虑编写一个检测器——这将是“给定一个页面,它是用什么博客引擎发布的”的基础。

有了足够多的爬虫和检测器,应该可以将给定的 RSS/Atom 提要指向外部并将其转换为全文提要。

但是,这种方法存在许多问题:

  • 虽然您可能能够针对 5 大博客引擎,但可能有一些您只需要拥有的博客没有被它们覆盖:例如,维基百科上列出了 61 个引擎;编写自己的博客引擎的人每个人都需要自己的刮板。
  • 每次博客引擎更改版本时,您都需要更改检测器和抓取工具。更准确地说,您需要添加一个新的刮板和检测器。检测器必须变得越来越挑剔以区分同一引擎的一个版本和下一个版本(例如,每次slashcode更改时,它通常会更改 HTML,但不同的 站点使用不同版本的 slash)。

我正在尝试考虑一个不错的后备方案,但一旦有我就会进行编辑。

于 2009-01-28T19:54:00.257 回答
0

RSS实际上很容易使用 XPath 解析任何 XML 解析器(或正则表达式,但不建议这样做),您正在浏览 <item> 标记,寻找 <title>、<link>、<description> 。

然后,您可以将它们作为不同的字段发布到数据库中,或者直接将它们合并到 HTML 中。如果 <description> 丢失,您可以抓取链接(一种方法是比较多个页面以清除 HTML 的布局部分)。

于 2008-12-14T10:42:52.230 回答