2013-06-11 74 views
2

我不知道是否有已可用其做类似的东西scrapely库例如,基于正则表达式

https://github.com/scrapy/scrapely

它所做的是你举一个例子URL,然后你给的资料你希望从HTML中提取..

url1 = 'http://pypi.python.org/pypi/w3lib/1.1' 
data = {'name': 'w3lib 1.1', 'author': 'Scrapy project', 'description': 'Library of web-related functions'} 

,然后你开始这个规则通过简单:

s.train(url1, data) 

现在,我可以从不同的URL中提取相同的数据...

但有其不相同,但对于原始文本,任何图书馆......

例如:

raw_text = "|foo|bar,name = how cool" 

然后我想从中提取“酒吧”。

我知道,我可以写一个简单的正则表达式规则,并获取与此做..但是否有任何可用的库,它解决了这个作为一个基于实例的学习问题..

即,而不是指定一个正则表达式规则,然后通过它传递数据..

而是我指定一个实例,我想提取什么,它会自动生成规则?

希望我有所帮助。

+2

相关:http://txt2re.com/ – jfs

+0

一些理论:论学习正则语言(http://cstheory.blogoverflow.com/2011/08/on-learning-regular-languages/) 。注意:在实践中,它可能更简单。 – jfs

回答

0

如果你喜欢刮脸,你可以使用它。首先,将文本转换为类似于html的内容,例如通过将文本中的所有相关标记替换为<br>。然后执行Scrapely train方法中的操作,除了从远程位置获取html外。

如果效果很好,scrapely人可能会喜欢在Github上你拉的请求。

0

试图在雷达下飞行这个答案,因为你已经删除了实际的问题是该职位:Python中

那么嵌套的字典/ JSON,我解决它在我的Python和这方面的工作是我想出来的。

import re 
from itertools import chain 

d = {'foo': ['a', 'b'], 'foo::bar':['c'], 'foo::bar::baz':['z'], 'foo::baz':['f'], 'bar' :['d'], 
'bar::baz': ['d', 'a'], 'boom':[], 'boom::bam::boombam' : ['foo']} 

dic = {} 
hiers = {} 
for k,v in d.items(): 
    if '::' not in k: 
     if not v: 
      dic[k] = {'inner_tag':{}} 
     else: 
      dic[k] = {'sources':v, 'inner_tag':{}} 
    if '::' in k: 
     hiers[k] =v 

it = iter(hiers) 
i = next(it) 

def reg(i): 
    return[m.start() for m in re.finditer('::',i)] 

for k,v in dic.items():  
    while True: 
     try:    
      nxt = next(it)  
      it = chain([nxt], it)    
      curr_len = len(reg(i)) 
      nxt_len = len(reg(nxt)) 
     except StopIteration: 
      v['inner_tag'][i] = {'sources':hiers[i]} 
      break 
     if curr_len <= nxt_len and i[:2] == nxt[:2]: 
      v['inner_tag'][i] = {'sources':hiers[i], 'inner_tag':{}}  
      last = i 
      i = next(it)  
     elif i[:2] != nxt[:2]: 
      v['inner_tag'][i] = {'sources':hiers[i]} 
      last = i 
      i = next(it) 
      break 
     else: 
      v['inner_tag'][last]['inner_tag'][i] = hiers[i] 
      last = i 
      i = next(it)    
      continue         

print(dic)