BeautifulSoup返回空的td标记

2024-04-25 09:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从这个url“http://baloncestoenvivo.feb.es/Game/1881578”获取一些信息。我想得到一个表中的所有信息,这个表位于一个div中,这个div包含这个id = "keyfacts-playbyplay-content-scroll"

我使用以下代码访问此表:

table = page_soup.find(id="keyfacts-playbyplay-content-scroll").findAll("table", {"class" : "twelve even"})

然后,打印“table”看看我得到了什么,我得到了一个没有数据的tr。但是,使用firefox或chrome控制台,我们可以看到有799个表行包含数据!!!在

这是我在python控制台中打印“table”时得到的结果:

^{pr2}$

这是我们在控制台中看到的:

enter image description here

为什么不一样呢?所有的tr标签和他们的td标签都有信息吗?在

我做错什么了?在


Tags: 数据div信息idhttpurltable标签
2条回答

其背后的原因是我们需要使用类似Selenium的浏览器仿真器来呈现由javascript生成的动态内容。 如果我们试图只通过请求请求来请求此数据,我们将无法获得您要查找的td。我推荐官方的Selenium文档或Youtube教程,一旦你掌握了一些东西,它很容易使用。在

Selenium Documentation

from bs4 import BeautifulSoup
import requests


asdf = requests.get('http://baloncestoenvivo.feb.es/Game/1881578').text
soup = BeautifulSoup(asdf, 'lxml')


tabl = soup.find('div',{'id':'keyfacts-playbyplay-content-scroll'}).find('div',{'class':'twelve columns'})

print(tabl)

这不起作用,它只返回不包含您要查找的信息的HTML的一部分(即表元素)

表的内容是通过JavaScript动态生成的。这就是页面源没有它们的原因。requests模块在不执行JavaScript的情况下获取页面源代码,这就是为什么您看到不完整的数据。在

如果选中dev tools中Network选项卡下的XHR选项卡,则会向http://baloncestoenvivo.feb.es/api/KeyFacts/1881578发送一个请求,该请求将以JSON的形式返回数据。您可以使用requests模块及其内置的.json()函数解析此数据。在

唯一的问题是,您需要传递以下标题。如果没有它们,网站将阻止脚本,您将看到requests.exceptions.ConnectionError。在

import requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
           'Accept': 'application/json, text/javascript, */*; q=0.01'}

r = requests.get('http://baloncestoenvivo.feb.es/api/KeyFacts/1881578', headers=headers)
data = r.json()

现在可以从data变量获取所有表值。要查看其结构,请使用^{}模块。在

例如,要获取玩家名称和对应的点数,可以使用以下命令:

^{pr2}$

输出:

A. ELONU 6
L. NICHOLLS GONZALEZ 10
S. DOMINGUEZ FERNANDEZ 13
L. QUEVEDO CAÑIZARES 0
M. ASURMENDI VILLAVERDE 5
F. ABDI 0
E. DE SOUZA MACHADO 13
L. GIL COLLADO 0
K. GIVENS 12
D. MOSS 2
A. ROBINSON 0

相关问题 更多 >