为更文明的时代收集数据
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对场景的独特贡献。
lxml和Beautifoul 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