0

在这里开始 Python 和 BeautifulSoup 用户。

我正在尝试从 ESPN 网站上获取一些运动成绩,但返回是空的。

样本目标:ESPN 网站 > NBA > 得分

我想获取一些信息,例如团队名称、分数、记录和四分之一/决赛,但由于我遇到了问题,我就从分数开始。我想得到球队的总分。

from bs4 import BeautifulSoup as bs
from urllib.request import urlopen as uReq

html_url = 'http://www.espn.co.uk/nba/scoreboard'

uClient = uReq(html_url)

page_html = uClient.read()

uClient.close()

page_soup = bs(page_html, 'html.parser')

containers = page_soup.findAll('td',{"class":"total"})

print (len(containers))
print (type(containers))

输出

0
<class 'bs4.element.ResultSet'>

我花了一整天的时间试图弄清楚为什么我的所有结果都不断返回 NoneType 和空我似乎无法弄清楚。

我试着寻找'td',这就是结果

containers = page_soup.findAll('td')

print (len(containers))
print (type(containers))

输出

0
<class 'bs4.element.ResultSet'>

不知道为什么我无法提取数据。ESPN 是否故意不允许我们抓取的幕后发生了什么?我尝试过查看不同的标签、属性等,但无法弄清楚。谢谢

4

2 回答 2

1

我相信您遇到的问题是由于 Web 内容是通过 Javascript 动态显示的。您的操作方式不会让您访问该信息,但您可能希望查看这篇关于同时使用 Selenium 和 BeautifulSoup 来解析动态 Web 内容的帖子。尝试运行下面的代码以获得您在那里搜索的分数:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.espn.co.uk/nba/scoreboard")

html = driver.page_source
soup = BeautifulSoup(html, "lxml")

for tag in soup.find_all("td", {"class":"total"}):
    print (tag.text)

这会产生以下输出:

87
99
106
102
123
131

您可能需要查看这篇文章以下载 Selenium 并将其添加到您的系统 PATH 以使脚本正常工作。

编辑:更新以指定BeautifulSoup 文档lxml推荐的 HTML 解析器的速度。

于 2018-04-22T01:47:42.663 回答
0

您尝试获取的数据是由于浏览器中运行的 JavaScript 而呈现的。我推荐你RequestsHTML

代码:

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('http://www.espn.co.uk/nba/scoreboard')
r.html.render()

for tag in r.html.find('td.total'):
    print(tag.text)

输出:

106
102
123
131
105
121
102
115

不要忘记安装它:pip install requests-html。玩得开心!:)

于 2018-04-22T12:13:53.677 回答