Python 匹配不需要的链接

Python 匹配不需要的链接,python,html,web-scraping,html-parsing,beautifulsoup,Python,Html,Web Scraping,Html Parsing,Beautifulsoup,我编写了一个库,通过从维基百科中提取href链接并保存它们,创建了一个持久性层。我意识到我有一个我不关心的链接,它被标记为/wiki/Cookbook:Table\u of_Contents 模仿的最佳方式是什么~(不匹配)并保持Pythonic 为了更好地理解上下文,我会在ruby中这样解决这个问题: if link =~ %r{^/wiki/Cookbook} && link !~ /Table_of_Contents/ 我的代码: def fetch_links(self

我编写了一个库,通过从维基百科中提取href链接并保存它们,创建了一个持久性层。我意识到我有一个我不关心的链接,它被标记为
/wiki/Cookbook:Table\u of_Contents

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

为了更好地理解上下文,我会在ruby中这样解决这个问题:

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'])]

有多种方法可以排除不需要的链接

一个选项是在
href
参数值中:

soup.find_all('a', href=lambda x: 'Table_of_Contents' not in x)
这将过滤掉
href
属性中没有
目录的
标记

例如:

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)]

为什么要投否决票?我只是在寻找第二种意见或更好的替代方案,而不是钓鱼竿。doc链接+1。我从来没有想过传递href a函数,但在考虑过它之后,只要它返回一个布尔值,它就是合法的。你是怎么想到这个主意的?!非常聪明。@TheGrayFox是的,这就是为什么这汤标签很漂亮的原因——它是一个很棒的图书馆。您越熟悉它,就越意识到它是python中最方便、最令人愉快的库之一。并且,仅供参考,您还可以将a作为参数值传递:
soup.find_all('a',href=re.compile(r'my_pattern_here'))
。谢谢。谢谢你的提示,我会清理干净的。
[u'legal', u'google']