0

我只想在此wiki 页面的表格中获取那些指向包含信息的页面的学校 URL。错误的 url 显示为红色,在“标题”属性旁边包含短语“页面不存在”。我正在尝试使用 re.match() 过滤 URL,以便我只返回那些不包含上述字符串的 URL。为什么 re.match() 不起作用?

网址:

districts_page = 'https://en.wikipedia.org/wiki/List_of_school_districts_in_Alabama'

功能:

def url_check(url):

    all_urls = []

    r = requests.get(url, proxies = proxies)
    html_source = r.text
    soup = BeautifulSoup(html_source)

    for link in soup.find_all('a'):
        if type(link.get('title')) == str:
            if re.match(link.get('title'), '(page does not exist)') == None: 
                all_urls.append(link.get('href'))
            else: pass

    return 
4

3 回答 3

2

这不能解决使用 解决问题re.match,但可能是不使用正则表达式的有效方法:

  for link in soup.find_all('a'):
    title = link.get('title')
    if title:
      if not 'page does not exist' in title: 
        all_urls.append(link.get('href'))
于 2013-08-12T18:18:05.383 回答
0

Unutbu 的回答解决了语法错误。但仅仅使用 re.match() 是不够的。Re.match 查看字符串的开头。re.search()遍历整个字符串,直到它发生在与输入模式匹配的字符串部分。

以下代码有效:

for link in soup.find_all('a'):
    if type(link.get('title')) == str:
        if re.search('page does not exist',link.get('title')) == None: 
            all_urls.append(link.get('href'))
return all_urls
于 2013-08-12T17:53:06.253 回答
0

参数的顺序re.match应该是模式然后是字符串。所以试试:

    if not re.search(r'(page does not exist)', link.get('title')): 

(我也改变re.matchre.search因为 - 正如@goldisfine 观察到的那样 - 模式不会出现在字符串的开头。)


使用@kindall 的观察,您的代码也可以简化为

for link in soup.find_all('a', 
        title=lambda x: x is not None and 'page does not exist' not in x):
    all_urls.append(link.get('href'))

这消除了两者if-statements。它都可以合并到对soup.find_all.

于 2013-08-12T17:46:42.833 回答