Python BS4 Beautiful Soup HTML.Parser在网站上不起作用

时间:2019-07-12 18:21:42

标签: python beautifulsoup

我有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')

2 个答案:

答案 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],

从这里开始,只是找到与您要查找的数据相对应的正确索引。