我正在开发一个项目,我需要在http://www.nhl.com/的当前分数部分中找到的所有游戏ID#。下载每个游戏的内容/解析统计数据。我希望能够一次性获取所有当前游戏 ID,但由于某种原因,无论我如何尝试,我都无法下载该页面的完整 HTML。我正在使用 requests
和 beautifulsoup4
。
这是我的问题:
我确定我感兴趣的特定标签是 div
的 CSS 类 = 'scrblk'。因此,我编写了一个函数来传递到 BeautifulSoup.find_all()
中,以具体地为我提供具有该 CSS 类的 block 。它看起来像这样:
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-requiress
和--convert-links
标志,因此我下载了(或者我是这么认为的) 所有必要的数据。
通过上述所有操作,我无法从 HTML 文件中解析出我需要的数据;就好像它们没有被完全下载或什么的,但我不知道那是什么或如何修复它。我在这里做错了什么或错过了什么?我在 Ubuntu 15.04 上使用 python 2.7.9。
所有文件都可以在这里下载:
https://www.dropbox.com/s/k6vv8hcxbkwy32b/nhl_html_examples.zip?dl=0
最佳答案
正如对您问题的评论所述,您必须重新考虑您的方法。您在浏览器中看到的内容并不是响应中包含的内容。该网站使用 JavaScript 加载您所需的信息,因此您应该在结果中更加仔细地查看,以找到您要查找的内容。
将来要处理此类问题,请尝试 Chrome 的开发人员控制台并禁用 JavaScript 并以这种方式打开网站。然后你会看到你是否面对 JS 或者该网站是否包含你正在寻找的值。
顺便说一下,您的行为违反了 NHL 网站的服务条款(根据第 2 节“禁止的内容和事件”)
Engage in unauthorized spidering, scraping, or harvesting of content or information, or use any other unauthorized automated means to compile information;
关于python - 使用 Python 下载网页的完整 HTML 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32777492/