【问题标题】:Map RSS entries to HTML body w. non-exact search将 RSS 条目映射到 HTML 正文 w。非精确搜索
【发布时间】:2010-09-26 19:16:25
【问题描述】:

你会如何解决这个问题?

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

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

RSS 条目如下所示:

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

HTML 中的博客文章如下所示:

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

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

其他规则/注意事项:

  • 标题可能不是唯一的。这种情况发生的频率比您想象的要多。我见过的例子:“Monday roundup”、“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% 准确率不是限制。但是,越准确越好。

那么,你会怎么做?

【问题讨论】:

  • 很难理解前几段。编辑?
  • 重写了介绍,希望它更清楚一点

标签: algorithm rss screen-scraping html-content-extraction fuzzy-search


【解决方案1】:

我将为每个主要的博客引擎创建一个抓取工具。从每页一篇文章的正文开始。

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

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

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

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

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

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

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

  • 虽然您可能能够针对 5 大博客引擎,但可能有一些您必须拥有的博客没有被它们覆盖:例如有61 engines listed on Wikipedia;编写 own 博客引擎的人都需要自己的爬虫。
  • 每次博客引擎更改版本时,您都需要更改检测器和抓取工具。更准确地说,您需要添加一个新的刮板和检测器。检测器必须变得越来越挑剔才能区分同一引擎的一个版本和下一个版本(例如,每次slashcode 更改时,它通常会更改 HTML,但different sites 使用不同版本的斜杠)。李>

我正在想一个像样的后备方案,但一旦有我就会编辑。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多