#python #web-scraping #beautifulsoup
#python #веб-очистка #beautifulsoup
Вопрос:
Я пытаюсь очистить Википедию, используя Beautiful Soup. Я хочу получить текст внутри, но только содержимое строки с определенным текстом заголовка.
Например: я хочу получить список наград, полученных Аланом Тьюрингом отhttps://en.wikipedia.org/wiki/Alan_Turing
Нужная мне информация находится в правой таблице, в табличных данных, соответствующих заголовку таблицы с текстовыми наградами. Как я могу получить список наград?
Я попытался выполнить цикл по строкам таблицы и проверить, равен ли заголовок таблицы ‘Awards’, но я не знаю, как остановить цикл, если в таблице нет заголовка ‘Awards’.
testurl = "https://en.wikipedia.org/wiki/Alan_Turing"
page = requests.get(testurl)
page_content = BeautifulSoup(page.content, "html.parser")
table = page_content.find('table' ,attrs={'class':'infobox biography vcard'})
while True:
tr = table.find('tr')
if tr.find('th').renderContents() == 'Awards':
td = tr.find('td')
break
print(td)
Комментарии:
1. Не могли бы вы показать, что вы пробовали?
Ответ №1:
Вы можете использовать CSS selector th:contains("Awards")
— который выберет <th>
тег, содержащий текст Awards
.
Затем td a[title]
будет выбран следующий родственный файл <td>
и каждый <a>
тег с title=
атрибутом:
import requests
from bs4 import BeautifulSoup
url = 'https://en.wikipedia.org/wiki/Alan_Turing'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
awards = [a.text for a in soup.select('th:contains("Awards") td a[title]')]
print(awards)
С принтами:
["Smith's Prize"]
Для url = 'https://en.wikipedia.org/wiki/Albert_Einstein'
он будет печатать:
['Barnard Medal', 'Nobel Prize in Physics', 'Matteucci Medal', 'ForMemRS', 'Copley Medal', 'Gold Medal of the Royal Astronomical Society', 'Max Planck Medal', 'Member of the National Academy of Sciences', 'Time Person of the Century']
Обновление 2021/10/31
beautifulsoup4
версия 4.10.0
th:contains
теперь не рекомендуется, используйте th:-soup-contains
вместо th:contains
.
пример
awards = [a.text for a in soup.select('th:-soup-contains("Awards") td a[title]')]
Ответ №2:
Вот как вы можете получить доступ к части «Награды». Надеюсь, это полезно для вас
from bs4 import BeautifulSoup
import urllib.request
testurl = "https://en.wikipedia.org/wiki/Alan_Turing"
page = urllib.request.urlopen(testurl)
page_content = BeautifulSoup(page, "html.parser")
table = page_content.find('table' ,attrs={'class':'infobox biography vcard'})
for link in table.find_all('th'):
if link.text == 'Awards':
your_needed_variable = link.text
print(your_needed_variable)