匹配不需要的链接

时间:2014-10-06 22:14:59

标签: python html web-scraping html-parsing beautifulsoup

我已经编写了一个库,通过从Wikipedia中提取href链接并保存它们来创建一层持久性。我意识到我有一个链接,我并不关心它被标记为/wiki/Cookbook:Table_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'])]

1 个答案:

答案 0 :(得分:2)

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

一个选项是href参数值中的pass a function

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

这会过滤掉a属性中没有Table_of_Contents的{​​{1}}个标记。

示例:

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