Search on blog:

Scraping: Jak użyć wyrażenia regularnego w BeautifulSoup aby pobrać Laureatów Nobla z tabeli w Wikipedii

Chciałem użyć wyrażenia regularnego do pobrania linków do laureatów w tabeli na stronie List of Nobel Memorial Prize laureates in Economics

Najpierw próbowałem użyć r'^/wiki/[A-Z][a-z]*_[A-Z][a-z]*$') ponieważ wyglądało, że linki mają postać

/wiki/Paul_Krugman

ale okazało się, że to znajduje także linki postaci

/wiki/United_States

oraz, że jest kilka linków które mają więcej _ oraz mają znaki narodowe (ö) które są konwertowane do kodów (np. %C3%B6)

`/wiki/Bengt_R._Holmstr%C3%B6m` (`Bengt Holmström`)

Postanowiłem znaleźć pierwszą tabelę i pracować z każdym wierszem z osobna aby brać link tylko z trzeciej kolumny. Ale tu był problem ponieważ HTML używa colspan do łączenia kolumn w dwóch/trzech wierszach więc w każdym wierszy ten link jest w innym <td> w kodzie HTML.

Postanowiłem szukać pierwszy link w wierszu, który pasuje do r'^/wiki/[^:]*$'. W ten sposób pomijałem linki z obrazkami /wiki/File:.... Ponieważ użyłem find() zamiast find_all() więc znajduję link tylko do laureatów i nie pobiera linku do United State, który jest następny w wierszu.

import requests
from bs4 import BeautifulSoup as BS
import re

r = requests.get('https://en.wikipedia.org/wiki/List_of_Nobel_Memorial_Prize_laureates_in_Economics')
soup = BS(r.text, 'html.parser')

all_tables = soup.find_all('table')

pattern = re.compile(r'^/wiki/[^:]*$')

for row in all_tables[0].find_all('tr'):
    item = row.find('a', {'href': pattern})
    if item:
        print(item['href'], '|', item['title'])
If you like it
Buy a Coffee