Esto es muy similar a otras publicaciones en SO, p. Ej. aquí, no puedo ver qué estoy haciendo mal.

Quiero eliminar el cuadro etiquetado como "actividad" en esto página, y quiero que la salida se vea así:

Entonces puede ver las dos características principales de interés en comparación con la página web original (1) combinando múltiples tablas en una tabla, simplemente creando una nueva columna si la columna aún no se ve y (2) quiero extraer el href real para esa columna en lugar de solo el nombre, por ejemplo 'Jacobsen et al' porque finalmente iba a extraer el valor PMID (un número entero) del href.

Estos son mis dos objetivos, escribí este código:

import requests
import pandas as pd
from bs4 import BeautifulSoup

for i in range(23,24):
#    try:
        res = requests.get("http://www.conoserver.org/index.php?page=card&table=protein&id=" + str(i))
        soup = BeautifulSoup(res.content, 'lxml')
        table = soup.find_all('table',{'class':'activitytable'})
        for each_table in table:

            #this can print references
            print(each_table.a)

            #this can print the data frames
            df = pd.read_html(str(each_table))
            print(df)

            #how to combine the two?

¿Alguien puede decirme la forma correcta de imprimir el href individualmente para cada fila de cada tabla (por ejemplo, esencialmente para que agregue una columna adicional a cada tabla con el href real ?; por lo que debería imprimir tres tablas, con una columna href adicional en cada mesa)

Entonces puedo intentar concentrarme en cómo combinar las tablas, acabo de mencionar el objetivo final aquí en caso de que alguien pueda pensar en una forma más pitónica de matar dos pájaros de un tiro / en caso de que ayude, pero creo que son diferentes. asuntos.

0
Slowat_Kela 15 oct. 2019 a las 17:52

1 respuesta

La mejor respuesta

Puede inicializar un marco de datos final. Luego, mientras itera, almacene href como una cadena variable y luego agregue esa columna al marco de datos de la subtabla. Luego, seguirá agregando esos marcos de datos a un marco de datos final:

import requests
import pandas as pd
from bs4 import BeautifulSoup

# Initalized empty "final" dataframe
final_df = pd.DataFrame()
for i in range(20,24):
#    try:
        res = requests.get("http://www.conoserver.org/index.php?page=card&table=protein&id=" + str(i))
        soup = BeautifulSoup(res.content, 'lxml')
        table = soup.find_all('table',{'class':'activitytable'})
        for each_table in table:

            #Store the href
            href = each_table.a['href']

            #Get the table
            df = pd.read_html(str(each_table))[0]

            #Put that href in the column 'ref'
            df['ref'] = href

            # Append that dataframe into your final dataframe, and repeat
            final_df = final_df.append(df, sort=True).reset_index(drop=True)
1
chitown88 15 oct. 2019 a las 15:12