【问题标题】:Configurable HTML information extraction可配置的 HTML 信息提取
【发布时间】:2019-11-05 12:02:55
【问题描述】:

场景:

我正在使用爬虫进行一些 HTML 信息提取。目前,大多数提取规则都是硬编码的(不是标签或类似的东西,而是循环、嵌套元素等)

例如,一个常见的任务如下:

  1. 获取 ID 为 X 的表。如果不存在,则可能有其他机制,因此请查找触发的信息
  2. 查找包含一些信息的行。通常匹配是针对特定列的正则表达式。
  3. 检索不同列中的数据(通常在 td 中标记,或之前在标题中检测到)

我目前这样做的方式是:

  1. 查询以获取第一个 ID 为 X 的表的主体(X 在配置文件中)。我列表中的一些网站有问题,并且在不同于表格的元素上重复了该 ID -.-
  2. 遍历感兴趣的单元格,在 cell.text() 上执行正则表达式(正则表达式在配置文件中)
  3. 获取匹配单元格的父行,并从该行中获取我需要的单元格(该行的标识符在配置文件中)

将所有这些大部分硬编码(列名、表 ID 等除外)给我带来了好处或易于实现并且比通用解析器更高效,但是,它的可配置性较低,并且在目标网站迫使我处理代码,这使得委派任务变得更加困难。

问题

是否有任何语言(最好有可用的 java 实现)允许一致地为这些提取定义规则?我在某些任务中使用了 css 样式的选择器,但其他的并不是那么简单,所以我最好的猜测是必须有一些扩展,非程序员维护者可以按需添加/修改规则。

如果有的话,我会接受基于 Nutch 的答案,因为我们正在研究将爬虫迁移到 nutch,不过,我更喜欢通用的 java 解决方案。

我正在考虑编写一个解析器生成器并创建我自己的一组规则来允许用户/维护者生成解析器,但这真的感觉就像无缘无故地重新发明轮子。

【问题讨论】:

    标签: java web-crawler information-retrieval information-extraction


    【解决方案1】:

    我正在做一些类似的事情 - 不完全是你正在寻找的东西,但也许你可以得到一些想法。

    首先是爬取部分: 我在 Python 3.7 上使用Scrapy。 对于我的项目,这带来了优势,即它非常灵活且易于构建的爬网框架。请求之间的延迟、HTTP 标头语言等大部分都可以配置。

    对于信息提取部分和规则: 在我的上一代爬虫中(我现在正在开发第三代,第二代仍在运行,但没有那么可扩展),我使用 JSON 文件为每个页面输入 XPath / CSS 规则。因此,在启动我的爬虫时,我已经为当前正在被爬取的一个特定页面加载了 JSON 文件,并且一个通用爬虫知道根据加载的 JSON 文件提取什么。

    这种方法不易扩展,因为必须为每个域创建一个配置文件。 目前,我仍在使用 Scrapy,起始列表包含 700 个要爬取的域,并且爬虫现在只负责将整个网站下载为 HTML 文件。 这些通过 shell 脚本存储在 tar 档案中。 之后,一个 Python 脚本将遍历 shell 脚本的所有成员,并分析内容以获取我要提取的信息。

    在这里,正如您所说,这有点像重新发明轮子或围绕现有库编写包装器。

    在 Python 中,可以使用BeautifulSoup 删除所有标签,如脚本和样式等。 然后,您可以提取所有文本。 或者您首先只关注表格,将所有表格提取到字典中,然后可以使用正则表达式或类似方法进行分析。 有像 DragNet 这样的库用于样板删除。 how to extract table structured information上还有一些具体的方法。

    【讨论】:

    • 这太基础了。我用 java 编写了一个新系统来配置一个完全可定制的爬网,包括网站、JSON、xml、html、二进制(使用 tika)。它对 java languaje 本身的简化有些不足。我是为我的企业做的,所以我不允许分享。我需要一些真正完整和通用的东西(即使能够配置动态 try/catch、列表迭代等)
    猜你喜欢
    • 2015-02-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多