【问题标题】:Webscraping Javascript Elements with Requests and Beautifulsoup使用请求和 Beautifulsoup 抓取 Javascript 元素
【发布时间】:2020-05-06 23:52:30
【问题描述】:

我正在开发我的第一个 Python 项目,使用 BeautifulSoup 从https://www.tva.com/Environment/Lake-Levels/South-Holston 抓取数据。我了解网络抓取的基础知识,并且一直在关注 YouTube 教程。我在尝试从上述 URL 中提取数据时遇到了问题。

   from bs4 import BeautifulSoup
   import requests

   URL = requests.get('https://www.tva.com/Environment/Lake-Levels/South-Holston')
   soup = BeautifulSoup(URL,'lxml')

   main_body = soup.body.div
   print(main_body.prettify())   

我使用上面的基本代码来解析网站主体的页面。在打印出解析的内容并将其与 Google Chrome 上的源代码进行比较后,我注意到某些元素丢失了。我试图解析的数据(Generation Releases 下的生成器)位于 HTML 类 <div class="tvawidget"... 内的表中。将解析后的数据与源代码进行比较时,会发现表中的数据和表本身与function display(data) 进行了交换。我希望所有这些都不会太令人困惑,如果我需要澄清,请告诉我。

Source Code of data I am trying to extract

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    你说得对,该元素是由 Javascript 填充的。但是你可以用requests模块模拟Ajax请求,例如:

    import re
    import requests
    
    url = 'https://www.tva.com/Environment/Lake-Levels/South-Holston'
    rest_api_url = 'https://www.tva.com/RestApi/generation-releases/{lake_name}?format=json'
    
    html_data = requests.get(url).text
    lake_name = re.search(r"lakeName\s*=\s*'(.*)'", html_data).group(1)
    
    data = requests.get(rest_api_url.format(lake_name=lake_name)).json()
    
    # pretty print to screen:    
    from pprint import pprint
    pprint(data)
    

    打印:

    [{'Day': '05/06/2020', 'Generators': '1', 'Time': '1 AM - Midnight EDT'},
     {'Day': '05/07/2020', 'Generators': '1', 'Time': 'Midnight - Midnight EDT'},
     {'Day': '05/08/2020', 'Generators': '1', 'Time': 'Midnight - 1 AM EDT'}]
    

    编辑:

    来自 Firefox 开发者工具的 URL 截图:

    【讨论】:

    • 太棒了,谢谢!我注意到美国能源信息署为 TVA 提供了一个 API,这也是解析表中数据的另一种选择吗?
    • @WarrenAustin 是的,您在网页上看到的表格似乎是从这个 Rest API 填充的 - 所以信息是一样的。
    • 你能解释一下你从哪里得到 rest_api_url 变量吗?
    • @WarrenAustin 我在 Firefox 开发人员工具中找到了“网络”选项卡的 URL(Chrome 也有类似的东西)。我用 URL 将屏幕截图添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多