【问题标题】:Web Scrape page with multiple sections具有多个部分的网页抓取页面
【发布时间】:2017-04-16 03:34:24
【问题描述】:

对 python 很陌生...我正在尝试我的第一个项目。

能够复制一些简单的演示......但我认为我正在尝试做的事情很少有额外的复杂性。

我正在尝试从 NHL 网站上抓取游戏日志

这就是我想出的......网站顶部的类似代码工作(例如:获取年龄)但它在显示逻辑部分失败(取决于用户是否点击职业,游戏日志或分裂)

提前感谢您的帮助

import urllib2
from bs4 import BeautifulSoup

url = 'https://www.nhl.com/player/ryan-getzlaf-8470612?stats=gamelogs-r-nhl&season=20162017'

page = urllib2.urlopen(url)
soup = BeautifulSoup(page, 'html.parser')
Test = soup.find_all('div', attrs={'id': "gamelogsTable"})

【问题讨论】:

  • 花了几个小时后,似乎没有出现在 Python 请求中......有什么想法吗?

标签: python beautifulsoup


【解决方案1】:

许多网页都会出现这种情况。这是因为某些内容是由作为初始下载一部分的 Javascript 代码下载的。通过这样做,设计师能够向访问者展示页面中最重要的部分,而无需等待整个页面下载完成。

当你想抓取一个页面时,你应该做的第一件事是检查它的源代码(通常在 Windows 环境中使用 Ctrl-u),看看你需要的内容是否可用。如果没有,那么您将需要使用 BeautifulSoup 之外的东西。

>>> getzlafURL = 'https://www.nhl.com/player/ryan-getzlaf-8470612?stats=gamelogs-r-nhl&season=20162017'
>>> import requests
>>> import selenium.webdriver as webdriver
>>> import lxml.html as html
>>> import lxml.html.clean as clean
>>> browser = webdriver.Chrome()
>>> browser.get(getzlafURL)
>>> content = browser.page_source
>>> cleaner = clean.Cleaner()
>>> content = cleaner.clean_html(content)
>>> doc = html.fromstring(content)
>>> type(doc)
<class 'lxml.html.HtmlElement'>
>>> open('c:/scratch/temp.htm', 'w').write(content)
775838

通过在文件temp.htm 中搜索标题“Ryan Getzlaf 游戏日志”,我能够找到这部分 HTML 代码。如您所见,它与您期望在原始下载的 HTML 中找到的内容有关。但是,需要执行此额外步骤。

              </div>
            </li>
    </ul>

    <h5 class="statistics__subheading">Ryan Getzlaf Game Logs</h5>

    <div id="gamelogsTable"><div class="responsive-datatable">

我应该提一下,还有其他访问此类代码的方法,其中之一是dryscrape。我根本懒得在这台 Windows 机器上安装那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2016-08-09
    相关资源
    最近更新 更多