【发布时间】:2015-09-25 08:01:29
【问题描述】:
我正在做一个项目,我需要在http://www.nhl.com/ 的当前分数部分中找到的所有游戏 ID # 来下载每个游戏的内容/解析统计信息。我希望能够一次获得所有当前的游戏 ID,但由于某种原因,无论我如何尝试,我都无法下载页面的完整 HTML。我正在使用requests 和beautifulsoup4。
这是我的问题:
我确定我感兴趣的特定标签是div,其中 CSS class= 'scrblk'。所以,我写了一个函数来传递给BeautifulSoup.find_all(),特别是给我那个CSS类的块。它看起来像这样:
def find_scrblk(css_class):
return css_class is not None and css_class == 'scrblk'
所以,当我在 Firefox 中实际访问网页并保存它,然后在 beautifulsoup4 中加载保存的文件时,我做了以下操作:
>>>soup = bs(open('nhl.html'))
>>>soup.find_all(class_=find_scrblk)
[<div class="scrblk" id="hsb2015010029"> <div class="defaultState"....]
一切都很好,花花公子;我有我需要的所有信息。但是,当我尝试使用我知道的几种自动化方法中的任何一种来下载页面时,它只返回了一个空列表。这是我尝试过的:
- 使用
requests.get()并将.text属性保存在文件中 - 使用
request的iter_content()和iter_lines()方法 逐个写入文件的对象 - 使用
wget下载页面(通过subprocess.call()) 并打开生成的文件。对于这个选项,我肯定会使用--page-requisites和--convert-links标志,所以我下载了(或者我想) 所有必要的数据。
通过以上所有方法,我无法从 HTML 文件中解析出我需要的数据;好像它们没有被完全下载或其他东西,但我不知道那是什么东西或如何修复它。我在这里做错了什么或错过了什么?我在 Ubuntu 15.04 上使用 python 2.7.9。
所有文件都可以在这里下载:
https://www.dropbox.com/s/k6vv8hcxbkwy32b/nhl_html_examples.zip?dl=0
【问题讨论】:
-
页面使用Javascript和AJAX加载数据。您应该使用浏览器的开发人员控制台来查看请求,也许您可以复制它们。当然,您首先需要 nhl.com 的许可才能使用他们的数据。
-
顺便说一句,鉴于您的情况,摆脱
find_scrblk功能,只使用soup.find_all(class_='scrblk')
标签: python html beautifulsoup python-requests