【发布时间】:2019-11-05 12:02:55
【问题描述】:
场景:
我正在使用爬虫进行一些 HTML 信息提取。目前,大多数提取规则都是硬编码的(不是标签或类似的东西,而是循环、嵌套元素等)
例如,一个常见的任务如下:
- 获取 ID 为 X 的表。如果不存在,则可能有其他机制,因此请查找触发的信息
- 查找包含一些信息的行。通常匹配是针对特定列的正则表达式。
- 检索不同列中的数据(通常在 td 中标记,或之前在标题中检测到)
我目前这样做的方式是:
- 查询以获取第一个 ID 为 X 的表的主体(X 在配置文件中)。我列表中的一些网站有问题,并且在不同于表格的元素上重复了该 ID -.-
- 遍历感兴趣的单元格,在 cell.text() 上执行正则表达式(正则表达式在配置文件中)
- 获取匹配单元格的父行,并从该行中获取我需要的单元格(该行的标识符在配置文件中)
将所有这些大部分硬编码(列名、表 ID 等除外)给我带来了好处或易于实现并且比通用解析器更高效,但是,它的可配置性较低,并且在目标网站迫使我处理代码,这使得委派任务变得更加困难。
问题
是否有任何语言(最好有可用的 java 实现)允许一致地为这些提取定义规则?我在某些任务中使用了 css 样式的选择器,但其他的并不是那么简单,所以我最好的猜测是必须有一些扩展,非程序员维护者可以按需添加/修改规则。
如果有的话,我会接受基于 Nutch 的答案,因为我们正在研究将爬虫迁移到 nutch,不过,我更喜欢通用的 java 解决方案。
我正在考虑编写一个解析器生成器并创建我自己的一组规则来允许用户/维护者生成解析器,但这真的感觉就像无缘无故地重新发明轮子。
【问题讨论】:
标签: java web-crawler information-retrieval information-extraction