Очистить данные из таблицы, элементы которой не загружаются сразу - PullRequest
2 голосов
/ 10 октября 2019

Я пытался очистить данные из таблицы с помощью селена, но когда я запускаю код, он получает только заголовок таблицы.

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)

Я также пытался найти элемент по имени тегаиспользуя таблицу, без удачи.

Ответы [ 4 ]

1 голос
/ 10 октября 2019

Я бы использовал requests и имитировал бы POST-запрос на странице как можно быстрее

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 голос
/ 10 октября 2019

вы должны попробовать это:

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

XPATH в «таблице» - это просто заголовок, фактический контент такой: '// * [@ id = "body"] / div / div[2] / div / div / div [2] / div [2] / div [3] / table / tbody / tr ['+ str (number) +'] ', поэтому вы не получаете контент, отличный отзаголовокПоскольку XPATH в строках имеет вид ..... / tr [2], ..... / tr [3], ..... / tr [4] и т. Д., Я использую str (число)<12, чтобы получить все исходные тексты, вы также можете попробовать по 50 строк за раз, зависит от вас. </p>

0 голосов
/ 10 октября 2019

Вам нужно дождаться исчезновения загрузчика, вы можете использовать invisibility_of_element_located, использовать WebDriverWait и expected_conditions. Для таблицы вы можете использовать css_selector вместо вашего 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 голосов
/ 10 октября 2019

Selenium загружает таблицу (происходит довольно быстро), а затем предполагает, что это сделано, поскольку у нее никогда не было возможности загрузить строки таблицы (происходит медленнее). Одним из способов решения этой проблемы является повторная попытка найти элемент, который не появится до тех пор, пока таблица не закончит загрузку.

Это FAR из наиболее элегантного решения (и, вероятно, библиотеки Selenium делают это лучше),но вы можете подождать таблицы, проверив, можно ли найти новую строку таблицы, и, если нет, поспите 1 секунду, прежде чем пытаться снова.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...