【问题标题】:button click prior to scraping html table在抓取 html 表之前单击按钮
【发布时间】:2020-03-31 19:17:54
【问题描述】:

您好,我正在尝试修改 HTML 表格并且我有工作代码。

然而,一个 URL 包含两个 html 表。第一个表包含“季度”数字并默认使用 url 加载。当您点击表格上方的按钮时,您可以切换到带有“年”号的第二张表格。

我的代码只选择加载 url 时出现的第一个默认(季度)表。

如何让我的 python 代码抓取第二个“年度”表?硒能做到这一点吗?如果可以,有人可以提供任何指导吗?

#!/usr/local/bin/python3

import requests
import pandas as pd

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'}
r = requests.get("https://www.investing.com/equities/exxon-mobil-income-statement", headers=headers)
df = pd.read_html(r.content)[1]
print(df)

非常感谢

【问题讨论】:

    标签: python pandas selenium


    【解决方案1】:

    是的,

    你可以用硒做到这一点。

    driver.get("https://www.investing.com/equities/exxon-mobil-income-statement")
    annual_button = driver.find_element_by_css_selector("#leftColumn > div.alignBottom > div.float_lang_base_1 > a:nth-child(1)")
    annual_button.click()
    print(driver.find_element_by_css_selector("#rrtable > table").get_attribute('innerHTML'))
    

    这是一个 Python 代码。

    它有什么作用?它进入页面,通过其css选择器找到Annual_button元素,然后单击它。然后,它通过它的 css 选择器找到表格并打印它的 HTML。

    希望对你有帮助。

    【讨论】:

    • 嗨 Nivardo,非常感谢。我在运行代码之前安装并导入了 selenium。不过,这似乎给了我一个错误:“NameError: name 'driver' is not defined”。还有什么我想念的吗?您实际上如何将硒放入熊猫数据框中?
    • 嘿,在继续之前,您可能应该学习硒教程。您需要声明一个 Chrome 驱动程序 'driver = webdriver.Chrome(executable_path=)' 但为此,您需要拥有 chromedriver。之后,您应该能够通过 selenium 启动一个 chrome 实例并开始使用这些元素。关于熊猫,我从未将它与 html 一起使用。但是,我认为您将能够获取表格的 html 并传递给熊猫。 :)
    【解决方案2】:

    经过大量谷歌搜索和其他一些堆栈帖子,终于可以正常工作了:

    from selenium import webdriver
    from bs4 import BeautifulSoup
    import pandas as pd
    
    browser = webdriver.Firefox(executable_path=r'/Users/xxxxxx/Documents/python/web_drivers/geckodriver')
    browser.get('https://www.investing.com/equities/exxon-mobil-income-statement')
    linkElem = browser.find_element_by_link_text('Annual')
    linkElem.click()
    
    r = browser.find_element_by_css_selector("#rrtable > table").get_attribute('outerHTML')
    browser.quit()
    
    soup = BeautifulSoup(r, 'html.parser')
    
    df = pd.read_html(str(soup))[0]
    
    print(df)
    

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      Sub Web_Table()
          Dim HTMLDoc As New HTMLDocument
          Dim objTable As Object
          Dim lRow As Long
          Dim lngTable As Long
          Dim lngRow As Long
          Dim lngCol As Long
          Dim ActRw As Long
          Dim objIE As InternetExplorer
          Set objIE = New InternetExplorer
          objIE.Navigate "https://www.investing.com/equities/exxon-mobil-income-statement"
      
          Do Until objIE.ReadyState = 4 And Not objIE.Busy
              DoEvents
          Loop
          Application.Wait (Now + TimeValue("0:00:03")) 'wait for java script to load
          HTMLDoc.body.innerHTML = objIE.Document.body.innerHTML
          With HTMLDoc.body
              Set objTable = .getElementsByTagName("table")
              For lngTable = 0 To objTable.Length - 1
                  For lngRow = 0 To objTable(lngTable).Rows.Length - 1
                      For lngCol = 0 To objTable(lngTable).Rows(lngRow).Cells.Length - 1
                          ThisWorkbook.Sheets("Sheet1").Cells(ActRw + lngRow + 1, lngCol + 1) = objTable(lngTable).Rows(lngRow).Cells(lngCol).innerText
                      Next lngCol
                  Next lngRow
                  ActRw = ActRw + objTable(lngTable).Rows.Length + 1
              Next lngTable
          End With
          objIE.Quit
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 2015-05-30
        相关资源
        最近更新 更多