2013-06-11 110 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)