python - tag - from bs4 import beautifulsoup
BeautifulSoup no analiza el contenido porque la página carga demasiado lento (2)
Como @Hassan Mehmood mencionó, debes usar selenio (o cualquier otro buscador de encabezados) para esto, porque la tabla se genera con javascript. beautifulsoup no evalúa javascript y no puede usarse para obtener los datos deseados.
Puedes usar esto como punto de mira:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
log = logging.getLogger(__name__)
logging.getLogger(''selenium'').setLevel(logging.WARNING)
logging.getLogger(''requests'').setLevel(logging.WARNING)
def test():
url = ''http://podaac.jpl.nasa.gov/ws/search/granule/index.html''
wait_for_element = 30
s = webdriver.PhantomJS()
s.set_window_size(1274, 826)
s.set_page_load_timeout(45)
s.get(url)
WebDriverWait(s, wait_for_element).until(
EC.presence_of_element_located((By.CLASS_NAME, "detailTABLE")))
datasets = s.find_elements_by_class_name("detailTABLE")
for item in datasets:
print item.text
if __name__ == ''__main__'':
test()
He intentado analizar una tabla desde la URL http://podaac.jpl.nasa.gov/ws/search/granule/index.html pero la tabla es tan grande que se tardan unos milisegundos en cargar la tabla después de cargar el archivo. sitio web. Dado que la sopa hermosa toma la primera instancia devuelta por el sitio web, no puede cargar la tabla completa, sino solo los encabezados de la tabla.
from bs4 import BeautifulSoup as bs
import requests
datasetIds = []
html = requests.get(''http://podaac.jpl.nasa.gov/ws/search/granule/index.html'')
soup = bs(html.text, ''html.parser'')
table = soup.find("table", {"id": "tblDataset"})
print table
rows = table.find_all(''tr'')
rows.remove(rows[0])
for row in rows:
x = row.find_all(''td'')
datasetIds.append(x[1].text.encode(''utf-8''))
print datasetIds
El código debe devolver el datasetIds en la primera tabla, pero solo devuelve los títulos de la tabla. ¡Gracias de antemano por la ayuda! :)
Los datos se recuperan con una solicitud de AJAX, puede hacer una obtención de lo que devuelve json formateado con muy buen gusto:
json = requests.get("http://podaac.jpl.nasa.gov/dmasSolr/solr/dataset/select/?q=*:*&fl=Dataset-PersistentId,Dataset-ShortName-Full&rows=2147483647&fq=DatasetPolicy-AccessType-Full:(OPEN+OR+PREVIEW+OR+SIMULATED+OR+REMOTE)+AND+DatasetPolicy-ViewOnline:Y&wt=json").json()
print(json)
Solo tenemos que tirar usando un par de teclas:
from pprint import pprint as pp
pp(json["response"]["docs"])
Un fragmento del resultado:
[{''Dataset-PersistentId'': ''PODAAC-MODST-M8D9N'',
''Dataset-ShortName-Full'': ''MODIS_TERRA_L3_SST_MID-IR_8DAY_9KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODST-MAN4N'',
''Dataset-ShortName-Full'': ''MODIS_TERRA_L3_SST_MID-IR_ANNUAL_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODSA-MMO9N'',
''Dataset-ShortName-Full'': ''MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODST-M1D9N'',
''Dataset-ShortName-Full'': ''MODIS_TERRA_L3_SST_MID-IR_DAILY_9KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-GHMTG-2PN01'',
''Dataset-ShortName-Full'': ''NAVO-L2P-AVHRRMTA_G''},
{''Dataset-PersistentId'': ''PODAAC-GHBDM-4FD01'',
''Dataset-ShortName-Full'': ''DMI-L4UHfnd-NSEABALTIC-DMI_OI''},
{''Dataset-PersistentId'': ''PODAAC-GHGOY-4FE01'',
''Dataset-ShortName-Full'': ''EUR-L4HRfnd-GLOB-ODYSSEA''},
{''Dataset-PersistentId'': ''PODAAC-GHMED-4FE01'',
''Dataset-ShortName-Full'': ''EUR-L4UHFnd-MED-v01''},
{''Dataset-PersistentId'': ''PODAAC-NSGDR-L2X02'',
''Dataset-ShortName-Full'': ''NSCAT_LEVEL_2_V2''},
{''Dataset-PersistentId'': ''PODAAC-MODST-M1D4N'',
''Dataset-ShortName-Full'': ''MODIS_TERRA_L3_SST_MID-IR_DAILY_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODSA-MMO4N'',
''Dataset-ShortName-Full'': ''MODIS_AQUA_L3_SST_MID-IR_MONTHLY_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODST-MMO4N'',
''Dataset-ShortName-Full'': ''MODIS_TERRA_L3_SST_MID-IR_MONTHLY_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODSA-MAN9N'',
''Dataset-ShortName-Full'': ''MODIS_AQUA_L3_SST_MID-IR_ANNUAL_9KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODSA-M8D4N'',
''Dataset-ShortName-Full'': ''MODIS_AQUA_L3_SST_MID-IR_8DAY_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-MODSA-M1D4N'',
''Dataset-ShortName-Full'': ''MODIS_AQUA_L3_SST_MID-IR_DAILY_4KM_NIGHTTIME''},
{''Dataset-PersistentId'': ''PODAAC-GOES3-24HOR'',
''Dataset-ShortName-Full'': ''GOES_L3_SST_6km_NRT_SST_24HOUR''},
Eso le da todos los pares de identificación de conjunto de datos y nombre corto de la tabla sin necesidad de bs4.
Para obtener los ID, solo tiene acceso a cada dict usando la clave Dataset-PersistentId
:
for d in json["response"]["docs"]:
print("ID for {Dataset-ShortName-Full} is {Dataset-PersistentId}".format(**d) )
Algunos resultados:
ID for OSTM_L2_OST_OGDR_GPS is PODAAC-J2ODR-GPS00
ID for JPL-L4UHblend-NCAMERICA-RTO_SST_Ad is PODAAC-GHRAD-4FJ01
ID for SEAWINDS_BYU_L3_OW_SIGMA0_ANTARCTICA_POLAR-STEREOGRAPHIC_BROWSE_IMAGES is PODAAC-SEABY-ANBIM
ID for SEAWINDS_BYU_L3_OW_SIGMA0_ANTARCTICA_POLAR-STEREOGRAPHIC_BROWSE_MAPS_LITE is PODAAC-SEABY-ANBML
ID for CCMP_MEASURES_ATLAS_L4_OW_L3_5A_5DAY_WIND_VECTORS_FLK is PODAAC-CCF35-01AD5
ID for QSCAT_BYU_L3_OW_SIGMA0_ARCTIC_POLAR-STEREOGRAPHIC_BROWSE_MAPS_LITE is PODAAC-QSBYU-ARBML
ID for MODIS_AQUA_L3_SST_MID-IR_ANNUAL_4KM_NIGHTTIME is PODAAC-MODSA-MAN4N
ID for UCLA_DEALIASED_SASS_L3 is PODAAC-SASSX-L3UCD
ID for NSCAT_LEVEL_1.7_V2 is PODAAC-NSSDR-17X02
ID for NSCAT_LEVEL_3_V2 is PODAAC-NSJPL-L3X02
ID for AVHRR_NAVOCEANO_L3_18km_MCSST_DAYTIME is PODAAC-NAVOC-318DY
ID for QSCAT_L3_OW_JPL_BROWSE_IMAGES is PODAAC-QSXXX-L3BI0
ID for QSCAT_BYU_L3_OW_SIGMA0_ANTARCTICA_POLAR-STEREOGRAPHIC_BROWSE_IMAGES is PODAAC-QSBYU-ANBIM
ID for NAVO-L4HR1m-GLOB-K10_SST is PODAAC-GHK10-41N01
ID for NCDC-L4LRblend-GLOB-AVHRR_AMSR_OI is PODAAC-GHAOI-4BC01
ID for SEAWINDS_LEVEL_3_V2 is PODAAC-SEAXX-L3X02
Hay una segunda solicitud ajax que devuelve más datos:
json = requests.get("http://podaac.jpl.nasa.gov/dmasSolr/solr/granule/select/?q=*&fq=Granule-AccessType:(OPEN+OR+PREVIEW+OR+SIMULATED+OR+REMOTE)+AND+Granule-Status:ONLINE&facet=true&facet.field=Dataset-ShortName-Full&rows=0&facet.limit=-1&facet.mincount=1&wt=json").json()
from pprint import pprint as pp
pp(json)
También puede cambiar algunos parámetros para darle salida diferente.