Динамически извлекать текст с веб-страницы с помощью Python BeautifulSoup - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь извлечь позицию игрока из веб-страниц многих игроков (вот пример для Malcolm Brogdon ). Я могу извлечь позицию Малкольма Брогдона, используя следующий код:

player_id = 'malcolm-brogdon-1'

# Import libraries
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup as soup
import pandas as pd
import numpy as np

url = "https://www.sports-reference.com/cbb/players/{}.html".format(player_id)
req = Request(url , headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()
page_soup = soup(webpage, "html.parser")

pos = page_soup.p.find("strong").next_sibling.strip()
pos

Однако я хочу иметь возможность делать это более динамичным c способом (то есть, чтобы найти «Position: "а затем найдите, что будет после). Есть другие проигрыватели, для которых структура веб-страницы немного отличается, и мой текущий код не возвращает позицию (например, Cat Barber ).

Я пробовал сделать что-то вроде page_soup.find("strong", text="Position:") но это, похоже, не работает.

Веб-страница спортивного справочника Малкольма Брогдона

1 Ответ

1 голос
/ 06 августа 2020

Вы можете выбрать элемент, который содержит текст «Позиция:», а затем следующий родственный текст:

import requests
from bs4 import BeautifulSoup


url = "https://www.sports-reference.com/cbb/players/anthony-cat-barber-1.html"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

pos = soup.select_one('strong:contains("Position")').find_next_sibling(text=True).strip()
print(pos)

Печать:

Guard

РЕДАКТИРОВАТЬ: Другая версия:

import requests
from bs4 import BeautifulSoup


url = "https://www.sports-reference.com/cbb/players/anthony-cat-barber-1.html"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

pos = (
    soup.find("strong", text=lambda t: "Position" in t)
    .find_next_sibling(text=True)
    .strip()
)
print(pos)
...