【问题标题】:instance based regex in pythonpython中基于实例的正则表达式
【发布时间】:2013-06-11 23:50:15
【问题描述】:

我想知道是否已经有一个类似于 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"

然后我想从中提取“bar”。

我知道,我可以编写一个简单的正则表达式规则并完成这个.. 但是有没有可用的库可以解决这个基于实例的学习问题..

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

相反,我指定了一个实例以及我想要提取的内容,它会自动构建规则?

希望我说得有道理。

【问题讨论】:

标签: python


【解决方案1】:

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

如果效果好的话,scrapely 的人可能会喜欢你在 Github 上的 pull request。

【讨论】:

    【解决方案2】:

    试图通过这个答案在雷达下飞行,因为您已经删除了实际问题所针对的帖子:在 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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 2011-05-14
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多