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'])
Buy a Coffee