Cześć, próbuję scape tabeli HTML i mam działający kod.

Jeden adres URL zawiera jednak dwie tabele html. Pierwsza tabela zawiera „kwartalne” liczby i ładunki domyślnie wraz z adresem URL. Klikając przycisk nad tabelą, możesz przejść do drugiej tabeli z liczbami „rocznymi”.

Mój kod pobiera tylko pierwszą domyślną (kwartalną) tabelę, która pojawia się po załadowaniu adresu URL.

Jak uzyskać kod Pythona, aby zeskrobał drugą „roczną” tabelę? Czy selen może to zrobić? Jeśli tak, czy ktoś mógłby udzielić wskazówek?

#!/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)

Wielkie dzięki

0
jarthoben 31 marzec 2020, 22:17

3 odpowiedzi

Najlepsza odpowiedź

Po wielu googlach i kilku innych postach na stosie w końcu to zadziałało:

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)
0
jarthoben 3 kwiecień 2020, 21:37

Tak,

Możesz to zrobić z selenem.

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'))

Oto kod w Pythonie.

Co to robi? Wchodzi na stronę, znajduje element Annual_button za pomocą jego selektora css i klika go. Następnie znajduje tabelę za pomocą selektora css i drukuje jej kod HTML.

Mam nadzieję, że to pomoże.

1
Nivardo Albuquerque 31 marzec 2020, 19:51

Spróbuj wykonać następujące czynności:

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

enter image description here

0
halfer 16 maj 2020, 21:48