网页新闻抓取(自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》)
优采云 发布时间: 2022-03-18 01:22网页新闻抓取(自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》)
项目起源
这个项目的开发源于我在CNKI上找到了一篇关于自动提取新闻网站文本的算法论文——《基于文本和符号密度的网页文本提取方法》
本文描述的算法看起来简洁、清晰、合乎逻辑。但是由于论文只讲了算法的原理,并没有具体的语言实现,所以我按照论文用Python实现了这个提取器。并使用今日头条、网易新闻、流浪星、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻进行测试,发现提取效果非常好,准确率几乎100%。
项目状态
在论文中描述的文本提取的基础上,我增加了标题、发表时间和文章作者的自动检测和提取。
最终输出如下图所示:
目前,这个项目是一个非常非常早期的Demo。发布是希望能尽快得到大家的反馈,以便更有针对性的开发。
本项目命名为提取器,而不是爬虫,以避免不必要的风险。因此,本项目的输入是HTML,输出是字典。请使用适当的方法获取目标网站的HTML。
这个项目没有也不会提供主动请求 网站 HTML 的能力。
如何使用
项目代码中的GeneralNewsCrawler.py 提供了本项目的基本使用示例。
from GeneralNewsCrawler import GeneralNewsExtractor
extractor = GeneralNewsExtractor()
html = '你的目标网页正文'
result = extractor.extract(html)
print(result)
对于大多数新闻页面,以上内容就可以了。
但是,某些新闻页面下会有评论。评论中可能会有冗长的评论。它们看起来更像文本而不是真正的新闻文本。因此extractor.extract()方法还有一个默认参数noise_mode_list,用于网页预处理。提前删除整个评论区。
noise_mode_list 的值是一个列表,列表中的每个元素都是一个 XPath,对应的是你需要提前移除的目标标签,可能会产生噪音。
例如,观察者网络下方评论区对应的Xpath为//div[@class="comment-list"]。所以在提取观察者网络的时候,为了防止评论干扰,可以加上这个参数:
result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])
test文件夹中网页的提取结果请查看result.txt。
已知问题 目前该项目仅适用于新闻页面的信息提取。如果目标网站不是新闻页面,也不是今日头条的专辑类型文章,提取结果可能不符合预期。可能有一些新闻页面,提取结果中的作者为空字符串。这可能是因为 文章 本身没有作者,或者没有覆盖现有的正则表达式。托多论文修改
在使用Python实现这个提取器的过程中,发现论文中的公式和方法存在一些缺陷,会导致部分节点报错。我将写几篇单独的 文章 帖子来介绍这里的变化。
项目地址: