jableparser是一个用于提取网页中正文及表格数据的Python库。从名字可以看出,它来源于另一个Python的HTML解析器——jparser,在其基础上完善了正文提取的策略,使得它能够正确处理更多种网页,并重点强化了网页中表格数据抓取和格式化功能,所以是一个更"able"版的jparser。
安装
pip install jableparser
使用
由于脱胎自jparser,jableparser的调用方法及返回数据格式与jparser基本一致。
import jableparser import pprint import requests url = "https://news.sina.com.cn/w/2020-06-07/doc-iircuyvi7181364.shtml" req = requests.get(url) req.encoding = 'utf-8' text = req.text pm = jableparser.PageModel(text) res = pm.extract() """ res: res['content']的值类型为list list中每一项为一个dict, key有type和data两种 type值有"text", "html", "image", "title"四种,分别对应文本,表格,图像和标题 """ for item in res['content']: if item['type']=="text": pprint.pprint(item['data']) """ '原标题:澳研究报告揭秘“新冠病毒中国造”来源!' '澳大利亚研究院责任技术中心近日发布的研究报告称,关于新冠病毒的虚假信息特别是“中国为研制生物武器而创造病毒”阴谋论在网络上散播的过程中,“支持特朗普”和“匿名者Q”社交媒体群发挥了协调作用。' '该中心委托昆士兰科技大学专家的研究表明,阴谋论在推特上的传播就像是一场协调的网络水军行动。他们对3月下旬推特上260万条与新冠病毒有关的推文以及在10天时间内对这些推文的2550万次转发作了分析,发现有5752个推特账户以一致的方式对新冠病毒相关信息转发了6559次,并且协调一致地散播有关“新冠病毒是中国制造的生物武器”阴谋论。在10天时间里,有882条原创推文与生物武器阴谋论有关,这些推文被转发18498次、点赞3783次,在推特上阅读量约500万次。研究还证实了一个互推虚假信息的网络,其中2903个账户之间有4125个链接关联。在这个网络中,研究人员发现了28个到30个账户组群,它们的标识都是“支持特朗普”、共和党,或者与支持特朗普的“匿名者Q”组织有关。' '报告说,“无论网络水军参与者精心谋划和推广这些关于生物武器阴谋论,还是由外部人员对此加以利用,所要达到的舆论效果是一致的,就是让谣言所推动的主题或话题被更广泛的边缘群体所接受,从而放大谣言的真实性”。报告指出,原始推文中所包含的错误和虚假信息不再只由机器人程序和其他相关账户推广,而是在更广范围内,被真实存在的普通用户转发。当媒体或社交大V们也参与到阴谋论中来时,即使有事实反驳,虚假信息也很容易引起公众的广泛关注。社交媒体网站经常在没有纠正或事实核对的情况下谈到阴谋论,结果使大量的新受众接触到了他们原本不会遇到的虚假信息。因此,小型媒体可能成为阴谋论进入主流舆论的重要途径。' '来源:经济日报' '责任编辑:郑亚鹏' """
此外,jableparser还对jparser提供的基础表格提取功能进行了强化,支持对更多种表格数据进行提取,并增加了对表格HTML字符串格式化输出功能。
pm = jableparser.PageModel(text) res = pm.extract() for item in res['content']: if item['type']=="html": pprint.pprint(pm.processtable(item['data'])) """ [('01', '这回,德国外长对黄之锋有点不一样'), ('02', '被罢免的韩国瑜:一步踏错 步步错'), ('03', '这是特朗普近来最兴奋的一天 又说漏嘴了一句话!'), ('04', '要求总统"撤军"反被攻击 美华盛顿特区市长加入抗议'), ('05', '北京一夜地摊世相:夜入千元的木匠 心虚犯怂的批发商')] [('01', '陕西蓝田通报“小学女生遭4名男生侵害”:多人受处分'), ('02', '今天,高考倒计时1个月,一起转发高考加油MV'), ('03', '意大利单日新增6557例确诊病例,累计确诊破5万'), ('04', '熊孩子用牙签扎破超市45袋真空包装大米,结果……'), ('05', '湖南"蛋白固体饮料"调查结果:欺诈误导消费 罚200万')] """
相比之下,jparser由于只能识别<table>标签,在此网页上即无法提取到表格数据。
对比测试
对相同网页以newspaper3k, jparser, jableparser三种工具比较提取效果。
https://en.wikipedia.org/wiki/George_H._W._Bush
newspaper3k: 未提取到正文,不支持提取表格数据
jparser: 提取出正文,同时将文章中的上角标数字也提取了出来;提取出了右侧第一个表格
jableparser: 提取出的正文,没有角标数字,且没有文末的引用标注;提取出了4个表格,包括两个非<table>标签的
https://www.ducksters.com/biography/entrepreneurs/steve_jobs.php
newspaper3k: 未提取到正文
jparser: 未提取到正文及表格
jableparser: 提取到全部正文,及开头的一个非<table>表格
上述两个网页均为百科类网页,而newspaper3k和jparser相对更适应新闻页面,所以此测试未必公允,但也能说明,jableparser在网页正文提取及表格提取上,有更广的适用范围。
注意事项
PageModule类中的proxesstable函数,目前只支持二列表和单列表的格式化提取,如果输入的HTML源码对应表格是其他列数,会返回空,这样设计是为了让表格抽取更具针对性,而不是把诸如目录一类的结构也当做表格抽取回来。
项目地址
https://github.com/qjfoidnh/jableparser
欢迎提issue和pull requests