2014-10-06 66 views
1

我写过一个库,它通过从维基百科中提取href链接并保存它们来创建一个持久层。我意识到我有一个链接,我不关心那个标签为/wiki/Cookbook:Table_of_Contents与不需要的链接匹配

模仿!~(不匹配)并保持Pythonic的最佳方式是什么?

为了更好的上下文和理解,我会解决这个问题,像这样的红宝石:

if link =~ %r{^/wiki/Cookbook} && link !~ /Table_of_Contents/ 

我的代码:

def fetch_links(self, proxy): 
    if not self._valid_proxy(proxy): 
     raise ValueError('invalid proxy address: {}'.format(proxy)) 
    self.browser.set_proxies({'http': proxy}) 
    page = self.browser.open(self.wiki_recipes) 
    html = page.read() 

    link_tags = SoupStrainer('a', href=True) 
    soup = BeautifulSoup(html, parse_only=link_tags) 
    recipe_regex = r'^\/wiki\/Cookbook' 
    return [link['href'] for link in soup.find_all('a') if 
      re.match(recipe_regex, link['href'])] 
+0

为什么downvote?我只是在寻找第二种意见或更好的选择,而不是钓鱼竿。 – theGrayFox 2014-10-06 22:19:46

回答

2

有多种方法来排除不需要的链接。

一种选择将是pass a functionhref参数值:

soup.find_all('a', href=lambda x: 'Table_of_Contents' not in x) 

这将过滤掉那些没有Table_of_Contentshref属性中a标签。

例子:

from bs4 import BeautifulSoup 

data = """ 
<div> 
    <a href="/wiki/Cookbook:Table_of_Contents">cookbook</a> 
    <a href="/wiki/legal_link">legal</a> 
    <a href="http://google.com">google</a> 
    <a href="/Table_of_Contents/">contents</a> 
</div> 
""" 

soup = BeautifulSoup(data) 
print [a.text for a in soup.find_all('a', href=lambda x: 'Table_of_Contents' not in x)] 

打印:

[u'legal', u'google'] 
+0

+1文档链接。我从来不会想过将href传递给一个函数,但只要它返回一个布尔值就会合法。你是怎么想出这个想法的?非常聪明。 – theGrayFox 2014-10-06 22:26:07

+1

@ TheGrayFox yup,这是什么让这个标签汤美丽 - 这是一个伟大的图书馆。你越熟悉它越多,你意识到它是python中最方便,最愉快的库之一。并且,仅供参考,您可以传递一个[汇编正则表达式模式](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-regular-expression)作为参数值:'soup.find_all ('a',href = re.compile(r'my_pattern_here'))'。谢谢。 – alecxe 2014-10-06 22:28:36

+0

感谢您的提示,我会清理它。 – theGrayFox 2014-10-06 22:33:25