我有python 3.7代码,可以尝试从以下网站(https://www.whoscored.com/Matches/1294545/LiveStatistics/Germany-Bundesliga-2018-2019-Bayern-Munich-Hoffenheim)中提取足球统计数据。似乎我在BS4 Beautiful汤中使用的HTML解析器根本没有提取网站中的任何标签。
我首先尝试提取特定的标签,例如代表主队和客队的两个不同的div标签以及包含球员姓名的标签。当该列表显示提取标签的空白列表时,我只是尝试提取该网站上的所有div标签,但仍然得到一个空白列表。
这是我使用的代码:
from requests import get
from bs4 import BeautifulSoup
url = 'https://www.whoscored.com/Matches/1294545/LiveStatistics/Germany-
Bundesliga-2018-2019-Bayern-Munich-Hoffenheim'
response = get(url)
html_soup = BeautifulSoup(response.text, 'html.parser')
containers_home_offensive = html_soup.find_all('div')
答案 0 :(得分:0)
请求不是解析数据的最佳工具,因为该网站使用JavaScript,因此最好使用Selenium和Web驱动程序。 我尝试了一下,然后可以在两个不同的列表中解析这两个团队的球员的姓名。
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import time
# Open web page
driver = webdriver.Firefox(executable_path='YOUR PATH') #You have to put the path of your WebDriver
driver.get('https://www.whoscored.com/Matches/1294545/LiveStatistics/Germany-Bundesliga-2018-2019-Bayern-Munich-Hoffenheim')
# Accept
element=WebDriverWait(driver,20).until(ec.element_to_be_clickable((By.XPATH,"/html/body/div[1]/div/div/div[2]/button")))
driver.execute_script("arguments[0].click();", element)
time.sleep(3)
# Scrolling down the page
results = driver.find_element_by_css_selector("#statistics-table-home-summary > table:nth-child(1)")
driver.execute_script("arguments[0].scrollIntoView();", results)
time.sleep(7)
# Make soup
source = driver.page_source
soup = BeautifulSoup(source, 'lxml')
table_home = soup.find_all('table', {"id": "top-player-stats-summary-grid"})[0]
players_home = [a.text for a in table_home.find_all('a')]
print(players_home)
table_away = soup.find_all('table', {"id": "top-player-stats-summary-grid"})[1]
players_away = [a.text for a in table_away.find_all('a')]
print(players_away)
driver.quit()
答案 1 :(得分:0)
当您可以直接从HTML提取匹配统计信息时,就不必使用Selenium:
import re
from ast import literal_eval
url = 'https://www.whoscored.com/Matches/1294545/LiveStatistics/Germany-Bundesliga-2018-2019-Bayern-Munich-Hoffenheim'
res = requests.get(
url,
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',
}
)
res.raise_for_status()
html = res.text
到目前为止,没有什么特别的。
match_data = re.search('var matchStats = ([^;]+)', html, flags=re.MULTILINE).group(1)
match_data_clean = re.sub(',,', ",'',", match_data_clean)
stats = literal_eval(match_data_clean)
当我们检查match_data
时,可以看到一堆语法无效的数组,如下所示:
ams',,'yellow',,,21,328
因此,我们通过在逗号之间插入空字符串来清除re
魔术。
打印stats
给我们:
[[[37,
1211,
'Bayern Munich',
'Hoffenheim',
'24/08/2018 19:30:00',
'24/08/2018 00:00:00',
6,
'FT',
'1 : 0',
'3 : 1',
'',
'',
'3 : 1',
'Germany',
'Germany'],
[[[21, [], [['Kasim Adams', '', 'yellow', '', '', 21, 328428, 0]], 0, 1],
[23,
[['Thomas Müller',
'Joshua Kimmich',
'goal',
'(1-0)',
'',
23,
37099,
283323]],
[],
1,
0],
从这里开始,只是找到与您要查找的数据相对应的正确索引。