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'])
furas.pl