Python: significados de los atributos de la tabla en BeautifulSoup

CorePress2024-01-24  9

Para un proyecto que utiliza beautifulsoup, necesito adquirir el informe de "Ingresos trimestrales de Tesla". tabla de este sitio, https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue. Creo que he adquirido los datos HTML iniciales con precisión, pero no estoy seguro de qué etiqueta contiene la frase "Ingresos trimestrales de Tesla". está adjunto, pensé que podría estar debajo del título pero eso no genera la tabla.

r=requests.get( 'https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')
html_data=r.text
soup=BeautifulSoup(html_data)
#print(soup.prettify())
table_=soup.find_all('thead','Tesla Quarterly Revenue')
table_row=table_.find_all('tr')
for row in table_row:
    col = row.find_all("td")
    date =col[0].text
    revenue =col[1].text
    tesla_revenue = tesla_revenue.append({"Date":date, "Revenue":revenue}, ignore_index=True)

tesla_revenue.head()

Salida de sopa aquí

 <div class="col-xs-6">
       <table class="historical_data_table table">
        <thead>
         <tr>
          <th colspan="2" style="text-align:center">
           Tesla Quarterly Revenue
           <br/>
           <span style="font-size:14px;">
            (Millions of US $)
           </span>
          </th>
         </tr>
        </thead> 

Sé que podría seleccionar toda el área usando

soup.find_all('div',class_='col-xs-6') 

Pero hay varias tablas bajo esta etiqueta y no estoy seguro de cómo refinarlas más. Gracias por cualquier ayuda.

He pensado que puedo tomar la mesa de esta manera, table_=soup.find_all('table') table_=table_[1] , pero eso requiere inspeccionar en múltiples puntos para obtener la tabla número (y saber que existe)

-GKelly

27/03/2021 a las 13:46



------------------------------------

Está en el encabezado de una tabla. Puedes agarrar con el siguiente selector CSS

soup.select_one('#style-1 div + div .historical_data_table th')

Si quieres literalmente solo la primera línea, puedes usar stripped_strings y el índice 0:

[s for s in soup.select_one('#style-1 div + div .historical_data_table th').stripped_strings][0]

Como hay varias tablas con elclase historic_data_table, el selector anterior usa un elemento con id estilo-1 como ancla, se mueve a la tabla con la clase historic_data_table que es hija de un div que es hermano inmediato de otro div, que es hijo de ese ancla; luego pasa al subésimo lugar de esa tabla.



------------------------------------

Primero debes seleccionar main_content div, luego seleccionar la tabla dentro de él y finalmente encontrar la tabla correcta. este código te ayudará a encontrar el cuerpo correcto:

r=requests.get( 'https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')
html_data=r.text
soup=BeautifulSoup(html_data)
main = soup.find('div',id = 'main_content')
tables = main.find_all('table', class_='historical_data_table table')
table_ = ''
for table in tables:
    if table.text.find('Tesla Quarterly Revenue') >= 0:
        table_ = table
        break
table_ = table_.find('tbody')

table_row=table_.find_all('tr')

1

¡Gracias, esto parece ser lo que busco! ¿Por qué creas el objeto table_ vacío antes del bucle for? ¿Es para evitar un error si no se encuentra ninguna tabla?

-GKelly

29/03/2021 a las 10:09

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare