【问题标题】:Scraping iFrame with python使用 python 抓取 iFrame
【发布时间】:2017-11-02 05:22:00
【问题描述】:

通过一些搜索,我发现我试图抓取的内容位于 iframe 内部。这是我总是收到 None 作为我的结果的主要原因。我能够开始提取一些数据,例如标题,但是当涉及到表中的数据时,我只能得到第一个结果,即数字 1。这是代码:

from bs4 import BeautifulSoup
from selenium import webdriver  
from selenium.common.exceptions import NoSuchElementException  
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get('http://www.nhl.com/stats/player?aggregate=1&reportType=game&dateFrom=2017-10-20&dateTo=2017-10-31&filter=gamesPlayed,gte,1&sort=shots')
html = driver.page_source
driver.quit()
soup = BeautifulSoup(html,"html.parser")

stat_cat = soup.find('div',attrs={'class':'rt-tr'})
header = stat_cat.text.strip()

stats = soup.find('div',attrs={'class':'rt-td'})
player_stats = stats.text.strip()

print(header,player_stats)

我想弄清楚的是如何从第二个 soup.find 中获取 Player 和他的统计数据,但它只返回第一个 rt-td 结果。一旦我有了所有的数据,我不仅想打印它,还想把它保存到 csv 中。感谢您的观看!

【问题讨论】:

    标签: python iframe web-scraping


    【解决方案1】:

    试一试。如果您想从该表中获取所有数据,您可以让它运行脚本。

    import csv
    import requests
    
    outfile = open("table_data.csv","a",newline='')
    writer = csv.writer(outfile)
    writer.writerow(["n","m","y","u"])
    
    req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=true&reportType=basic&isGame=true&reportName=skatersummary&sort=[{%22property%22:%22shots%22,%22direction%22:%22DESC%22}]&cayenneExp=gameDate%3E=%222017-10-20%22%20and%20gameDate%3C=%222017-10-31%22%20and%20gameTypeId=2') 
    data = req.json()['data']
    for item in data:
        Player = item['playerName']
        Pos = item['playerPositionCode']
        GP = item['gamesPlayed']
        G = item['goals']
        A = item['assists']
        P = item['points']
        Plus_Minus = item['plusMinus']
        PIM = item['penaltyMinutes']
        PPG = item['ppGoals']
        PPP = item['ppPoints']
        SHG = item['shGoals']
        SHP = item['shPoints']
        GWG = item['gameWinningGoals']
        OTG = item['otGoals']
        S_down = item['shots']
        S_per = item['shootingPctg']
        TOI = item['timeOnIcePerGame']
        Shifts = item['shiftsPerGame']
        FOW = item['faceoffWinPctg']
        print(Player,Pos,GP,G,A,P,Plus_Minus,PIM,PPG,PPP,SHG,SHP,GWG,OTG,S_down,S_per,TOI,Shifts,FOW)
    
        writer.writerow([Player,Pos,GP,G,A,P,Plus_Minus,PIM,PPG,PPP,SHG,SHP,GWG,OTG,S_down,S_per,TOI,Shifts,FOW])
    outfile.close()
    

    部分结果:

    Brent Burns D 6 0 5 5 -3 4 0 3 0 0 0 0 31 0.0 1458.8333 29.0 0.0
    Max Pacioretty L 5 3 0 3 0 4 0 0 1 1 0 0 29 0.1034 1240.8 26.2 0.0
    Phil Kessel R 6 2 4 6 -1 4 0 4 0 0 2 2 27 0.074 1044.3333 21.5 0.3333
    Jakub Voracek R 5 2 4 6 2 8 0 0 0 0 0 0 26 0.0769 1191.2 25.4 1.0
    John Carlson D 5 0 3 3 -3 2 0 1 0 0 0 0 25 0.0 1686.2 29.4 0.0
    Evgeny Kuznetsov C 5 3 1 4 -1 6 0 1 0 0 1 0 24 0.125 1138.4 20.2 0.3703
    

    【讨论】:

    • 感谢 Shahin,它似乎获得了大部分数据,但出于某种原因,如果我们仔细观察,例如 Brent Burns 有 5 次助攻和 5 分,但只有 5 次出现?并且在导出时,玩家的名字被拆分,他的姓就变成了 Pos(位置)。我很好奇是否有解决方案并在没有数据的列中添加 0 或 nil?
    • 这也抓取了第一页上的 50 个,这个表中有 650 个。链接不会在第 1 页或第 7 页之间更改,否则我只会更改链接。我们将如何从这张桌子上吸引其他 600 名玩家?
    • 所以你想在一个线程中得到所有新问题的答案。浏览你的帖子,再想想你的第一个要求是什么。
    • 是的,您确实回答了我最初的问题,谢谢。只是在寻找进一步的指导。
    • 现在有点忙。只要我有空,也试着为你获取 650 条数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多