He estado tratando de raspar datos de una tabla usando selenio, pero cuando ejecuto el código, solo obtiene el encabezado de la tabla.

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.panamacompra.gob.pa/Inicio/#!/busquedaAvanzada?BusquedaRubros=true&IdRubro=41')
driver.implicitly_wait(100)
table = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[2]/div/div/div[2]/div[2]/div[3]/table/tbody')
print(t.text)

También intenté encontrar el elemento por nombre de etiqueta usando la tabla, sin suerte.

2
panrosk 10 oct. 2019 a las 05:49

4 respuestas

La mejor respuesta

Debe esperar hasta que desaparezca el cargador, puede usar invisibility_of_element_located, utilizar WebDriverWait y expected_conditions. Para la tabla, puede usar css_selector en lugar de su xpath.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome()
driver.get('http://www.panamacompra.gob.pa/Inicio/#!/busquedaAvanzada?BusquedaRubros=true&IdRubro=41')

time.sleep(2)
WebDriverWait(driver, 50).until(EC.invisibility_of_element_located((By.XPATH, '//img[@src="images/loading.gif"]')))
table = driver.find_element_by_css_selector('.table_asearch.table.table-bordered.table-striped.table-hover.table-condensed')
print(table.text)
driver.quit()
0
frianH 10 oct. 2019 a las 04:21

Deberías probar esto:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.panamacompra.gob.pa/Inicio/#!/busquedaAvanzada?BusquedaRubros=true&IdRubro=41')
driver.implicitly_wait(100)

table = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[2]/div/div/div[2]/div[2]/div[3]/table/tbody')
number=2
while(number<12):
    content = driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div/div[2]/div[2]/div[3]/table/tbody/tr['+str(number)+']')
    print(content.text)
    number+=1

El XPATH en 'tabla' es solo el encabezado, el contenido real es este: '// * [@ id = "body"] / div / div [2] / div / div / div [2] / div [2] / div [3] / table / tbody / tr ['+ str (number) +'] ', es por eso que no obtienes ningún contenido diferente al encabezado. Como el XPATH en las filas es como ..... / tr [2], ..... / tr [3], ..... / tr [4], etc., estoy usando el str (número) <12, para obtener todas las crudas, también puedes probar con 50 filas a la vez, depende de ti.

1
renzo paolo alegre flores 10 oct. 2019 a las 03:20

Selenium está cargando la tabla (sucede con bastante rapidez) y luego suponiendo que está hecho, ya que nunca se le da la oportunidad de cargar las filas de la tabla (ocurre más lentamente). Una forma de evitar esto es intentar buscar repetidamente un elemento que no aparecerá hasta que la tabla termine de cargarse.

Esto está LEJOS de la solución más elegante (y probablemente hay bibliotecas de Selenium que lo hacen mejor), pero puede esperar a la tabla verificando si se puede encontrar una nueva fila de la tabla, y si no, dormir durante 1 segundo antes de intentar de nuevo.

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time


driver = webdriver.Chrome()
driver.get('http://www.panamacompra.gob.pa/Inicio/#!/busquedaAvanzada?BusquedaRubros=true&IdRubro=41')

wvar = 0
while(wvar == 0):
  try:
    #try loading one of the elements we want to read
    el = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[2]/div/div/div[2]/div[2]/div[3]/table/tbody/tr[3]')
    wvar = 1
  except NoSuchElementException:
    #not loaded yet
    print('table body empty, waiting...')
    time.sleep(1)

print('table loaded!')

#element got loaded; reload the table
table = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[2]/div/div/div[2]/div[2]/div[3]/table/tbody')
print(table.text)
0
Nick Reed 10 oct. 2019 a las 03:47

Usaría requests e imitaría la solicitud POST de la página mucho más rápido

import requests

data = {'METHOD': '0','VALUE': '{"BusquedaRubros":"true","IdRubro":"41","Inicio":0}'}
r = s.post('http://www.panamacompra.gob.pa/Security/AmbientePublico.asmx/cargarActosOportunidadesDeNegocio', data=data).json()
print(r['listActos'])
1
QHarr 10 oct. 2019 a las 04:38
58314755