为更文明的时代收集数据

structominer的Python项目详细描述


struct-o-miner是一个优雅的python库,用于从html或xml文档中提取结构化数据。 这是理想的情况下,你有一个字符串,你的文件,只是希望它的数据, 类似于一个奇特的铸造操作。

功能

声明性语法。数据的格式是静态的,因此您必须编写任何命令性代码 提取它只是一个样板。相反,声明您感兴趣的结构 在django或sqlalchemy中定义模型的方式,并让struct-o-miner来处理无聊的部分。

丰富的数据类型。使用textfield、intfield等字段直接以python类型获取数据 或者DateTimeField。您甚至可以使用structuredlistfield拥有字典列表。

organized.抓取最麻烦的部分是数据清理。所有例外情况和 现实世界的考虑可能会迅速退化为复杂和无法维护的意大利面。 struct-o-miner提供了按字段和语义关注点分隔此代码的工具。

focused.struct-o-miner坚持做一件事并做好它的unix哲学: 你给它一个文档,它给你结构化的数据。刮擦不仅仅是 web爬行,struct-o-miner是一个小型库,它使您能够在任何项目中执行此操作, 没有额外的拐杖。

概述

作为一个简单的例子,请考虑下面的html代码片段:

<div><spanclass="foo">Foo</span><ahref="http://example.com/bar">Example: Bar</a><ul><li><span>2014-03-01</span>: 1 (one)</li><li><span>2014-03-05</span>: 3 (three)</li></ul></div>

这是一份针对我们可能感兴趣的一些数据的文档:

classStuff(Document):foo=TextField('//div/span[@class="foo"]')bar_name=TextField('//div/a')bar_url=URLField('//div/a')# Same xpath, but URLField extracts the hrefthings=StructuredListField('//div/ul/li',structure=dict(# A StructuredField for each element selected by the xpath above# Sub-element xpaths are relative to their respective parentdate=DateField('./span'),number=IntField('.')))@bar_name.postprocessordef_extract_the_bar_name(value,**kwargs):# Remove 'Example: ' after the field is parsedreturnvalue.split(' ')[-1]@bar_name.postprocessordef_uppercase_the_bar_name(value,**kwargs):# Handle the field after the previous processor ranreturnvalue.upper()@things.number.preprocessordef_clean_numbers(value,**kwargs):# Isolate the numeric part before the field is parsed as an intreturnvalue.strip(': ').split(' ')[0]

现在我们只需将html传递给这个对象进行解析,然后就可以使用典型的python元素访问来获得数据。 在struct-o-miner中,我们称之为value访问

>>> data=Stuff(html)>>> pprint(dict(data)){'bar_name': 'Bar',
 'bar_url': 'http://example.com/bar',
 'foo': 'Foo',
 'things': [{'date': datetime.date(2014, 3, 1), 'number': 1},
            {'date': datetime.date(2014, 3, 5), 'number': 3}]}

>>> data['things'][0]['date']datetime.date(2014, 3, 1)

也可以使用括号(即函数调用)访问每个数据的field对象。 字段访问一开始可能看起来不是pythonic,但是每个包含某种结构的字段 (listfield、dictfield、structuredfield和variants)也是可调用的,它返回 请求的子对象。

>>> data('things')(0)['date']datetime.date(2014, 3, 1)

>>> data('things')(0)('date')<structominer.fields.DateField object at 0x10efae7d0>
最后,第三个访问轴允许您到达用作结构的对象。 列表和词典等字段中的模板。结构访问使我们能够 在things.number上定义预处理器。请注意以下内容的不同之处:

>>> data.things.date<structominer.fields.DateField object at 0x10efa1250>

>>> data('things')(0)('date')<structominer.fields.DateField object at 0x10efae7d0>

备选方案

python生态系统提供了丰富的数据抓取和web爬行解决方案或与之相关的解决方案。 这是对可能的替代方案的调查,强调了struct-o-miner对场景的独特贡献。

lxmlBeautifoul Soup是 python scraper的标准构建块:它们都解析标记文档并提供一个接口 去质疑和操纵他们。但是直接使用它们可能会很麻烦,因为需要选择数据 手动操作。struct-o-miner提供了一个声明性接口,用于定位元素,然后使用lxml 在引擎盖下选择所有数据。

pyquery在lxml.etree中包装了一个jquery启发的api,web开发人员更熟悉它。 除了使用css选择元素的便利性之外,pyquery在与lxml的比较中没有什么优势。 类似地,cssselect将css选择器转换为xpath查询 然后可以与lxml一起使用。计划直接在struct-o-miner中支持它,以便 可以使用css指定字段。

Scrapy是一个完整的web爬网框架。 它可以用来建立一个可靠的爬行操作,并从一个大型社区以及 来自ScrapingHub的商业支持,包括用于运行大量零星项目的paas。 尽管风格方法不同,struct-o-miner在目的上可与垃圾物品和物品装载机相媲美。 不过,它的设计目的是作为一个独立的库提供此功能, 用AR更具Python味。

安装

您可以使用pip

$ pip install structominer

或者从GitHub使用git:

$ git clone https://github.com/aGHz/structominer.git
$ cd structominer && python setup.py install

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中运行时在两个枚举类之间切换   java如何让PicoContainer启动/停止/处置工厂注入的组件?   带有Recyclerview onClick的java多活动   java如何从TestNG tests和Selenium接口调用默认方法?   java无法在Eclipse3.5.2中折叠注释   RR和SJF CPU调度算法的Java代码   java从属性文件配置记录器   java Notify传输在字符更改后超过20个字节完成   java阵列究竟是如何工作的   java跨类/包维护全局但可变的变量   java向setMessageListener注册侦听器服务   java按钮单击不在片段中工作   java GSSExException:使用spnego在GSSAPI上未指定故障(机制级别:不支持/启用带有HMAC SHA196的加密类型AES256CTS模式)   用java绘制虚线的图形   java从networkdrive启动windows捆绑包使用不包括JRE?   多线程java线程体系结构与应用程序设计