【问题标题】:Python table scrape returning no dataPython 表抓取不返回任何数据
【发布时间】:2018-03-26 15:58:34
【问题描述】:

这似乎与我之前的帖子相似(我将在底部链接),但这是一个不同的 url,它使用表格。当我运行以下代码时,我可以获得提取的所有数据:

import requests

from bs4 import BeautifulSoup

url = "https://www.nascar.com/wp-content/plugins/raw-feed/raw-feed.php"
r = requests.get(url)


soup = BeautifulSoup(r.text, "lxml")

try:
     data = soup.find('div', class_='div-col1')
     print(data)

except:
     print("You Get Nothing!")

然后我将尝试更改为

try:
     data = soup.find_all('td', class_='car')
     print(data)

except:
     print("You Get Nothing!")

我只从thead 而不是tbody 中获取信息

我有什么遗漏或做错了吗?我越想确定,我要么出错,要么只返回空 []

另外,这个网页是动态的,我尝试了在我之前的帖子 Old Post 中给我的内容,我知道这两个页面之间的布局和编码是不同的,但我担心的是每次加载 Chrome我运行脚本的时间会很多,因为它可能需要每 30sec-1min 刷新 300-400 次 tp。

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    为什么不直接使用源,如果您看到链接的页面源它正在从https://www.nascar.com/live/feeds/live-feed.json获取数据,那么您可以轻松获取json格式的数据并根据需要进行解析.

    import requests
    import json
    
    url = "https://www.nascar.com/live/feeds/live-feed.json"
    res = requests.get(url)
    print(r.json())
    

    【讨论】:

    • 我应该提到我对此很陌生,我不知道我能做到这一点,但这也有帮助。谢谢!!
    • @johnll,这是该问题的完美解决方案。但是,我想如果你展示了如何使用 JSON 并打印一些东西,比如所有的名字,它会帮助 OP 理解更多。另外,删除import json 行,response.json() 不需要它,可能会混淆其他人。
    • @sbiondio,正如您所说,该页面通过从 johnll 显示的链接中获取数据来不断更新数据(准确地说大约每 5 秒)。您可以从此 JSON 中获取所有表格项。此外,requests.json() 比使用 bs4 的任何其他方法都要快。
    • @KeyurPotdar 谢谢你的澄清,这很有帮助!!!我正在玩它现在输出的东西!
    • @sbiondio,看看this question。也许它会帮助你更好地理解它。 (请记住,在使用 requests 时不必使用单独的 json 模块,它有自己的内置 response.json() 解析器)。
    【解决方案2】:

    您希望从该页面获取的数据是动态生成的,因此当您使用 requests 库发出 http 请求时,它无法处理。但是,您可以尝试使用同一作者 requests-html 的新库。它能够处理动态生成的内容。这就是你可以使用这个新库的方式:

    import requests_html
    
    URL = "https://www.nascar.com/wp-content/plugins/raw-feed/raw-feed.php"
    
    with requests_html.HTMLSession() as session:
        r = session.get(URL)
        r.html.render(sleep=5)
        for items in r.html.find('#pqrStatistic tr'):
            data = [item.text for item in items.find("th,td")]
            print(data)
    

    部分结果:

    ['pos', 'car', 'driver', 'manuf', 'delta', 'laps', 'last lap', 'best time', 'best speed', 'best lap']
    ['1', '54', 'Kyle Benjamin(i)', '', '--', '161', '36.474', '20.198', '93.752', '8']
    ['2', '98', 'Grant Enfinger', '', '0.761', '161', '36.402', '20.144', '94.003', '157']
    ['3', '4', 'Todd Gilliland #', '', '1.407', '161', '36.359', '20.142', '94.013', '158']
    ['4', '8', 'John H. Nemechek(i)', '', '2.177', '161', '36.304', '20.234', '93.585', '31']
    ['5', '16', 'Brett Moffitt', '', '3.268', '161', '36.145', '20.359', '93.010', '8']
    

    【讨论】:

    • 这可能正是我想要的!但是当我尝试运行它时,我得到了各种各样的错误。我安装了 requests_html,但出现了一系列错误: Traceback(最近一次调用最后一次):文件“/Users/salbiondio4/Documents/App Creation/PythonScripts/NASCAR/livefeed.py”,第 68 行,在 r.html .render(sleep=5) 从那个开始......它可能没有帮助,但我会做一些挖掘
    • 它需要python 3.6。
    • 认为这可能是问题所在,但我正在使用 python 3.6.2 在 PyCharm 中运行。用 python3 在终端中尝试过,同样的错误。它的开始看起来像是在尝试下载铬? "[W:pyppeteer.chromium_downloader] 开始 chromium 下载。下载可能需要几分钟。回溯(最近一次调用最后一次):"
    • 是的,它会在第一次运行时下载铬。但是,在第二次或第三次运行中(当您第一次进行实验时),它应该可以工作。它是为您获取数据以及错误还是仅获取您目前遇到的错误?
    • 我只得到错误,没有数据。难道我总是从我以前的项目中安装 Chromium 吗? (只是想出一些想法来提供帮助)
    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2020-08-27
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多