首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可配置HTML信息提取

可配置HTML信息提取
EN

Stack Overflow用户
提问于 2019-06-23 12:09:56
回答 1查看 80关注 0票数 0

场景:

我正在用爬虫做一些HTML信息提取。现在,大多数提取规则都是硬编码的(不是标签之类的,而是循环、嵌套元素等等)。

例如,一项共同任务如下:

  1. 获取ID X的表。如果不存在,可能会有其他机制,因此可以找到触发的信息。
  2. 找一行包含一些信息。通常,匹配是针对特定列的regexp。
  3. 检索另一列中的数据(通常在td中标记,或先前在标头中检测到)

我目前的做法是:

  1. 使用id X获取第一个表主体的查询(X在config文件中)。我列表中的一些网站是错误的,并且复制了与表不同的元素上的id --
  2. 在有趣的单元上迭代,在cell.text()上执行regexp (regexp在配置文件中)
  3. 获取匹配单元格的父行,并从该行获取所需的单元格(该行标识符在配置文件中)

与一般解析器相比,所有这些硬编码(列名、表ids等除外)给我带来了好处或易于实现,效率也比一般解析器高,但是,它的可配置性较低,目标网站中的一些更改迫使我处理代码,这使得委派任务变得更加困难。

问题

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

如果有这样的答案的话,我会接受一个基于nutch的答案,因为我们正在研究如何将爬虫迁移到nutch,尽管我更喜欢一个通用的java解决方案。

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

EN

回答 1

Stack Overflow用户

发布于 2019-11-18 13:20:41

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

首先是爬行部分:我在Python3.7上使用刮痕。对于我的项目,这带来了优势,它非常灵活,易于爬行框架的建设。例如请求之间的延迟、HTTP头语言等,大多数情况下都可以配置。

对于信息提取部分和规则:在我的上一代爬虫中(我现在正在开发第3代,第2代还在运行,但不是可伸缩的),我已经使用JSON文件为每个页面输入了XPath / CSS规则。因此,在启动我的爬虫时,我已经为当前正在爬行的一个特定页面加载了JSON文件,并加载了一个通用爬虫,知道了基于加载的JSON文件提取什么。

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

在这里,正如您所说的,这有点像重新发明轮子或者为现有的库编写一个包装器。

在Python中,可以使用BeautifulSoup删除所有标记,如脚本和样式等,然后可以提取所有文本。或者,您首先只关注表,将所有表提取到数据块中,然后可以使用regex或类似的方法进行分析。有像DragNet这样的库来删除样板。并且有一些关于如何提取表结构信息的具体方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56723719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档