从元素不立即加载的表中刮取数据

2024-09-29 00:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用selenium从表中提取数据,但是当我运行代码时,它只获取表的标题。你知道吗

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)

我还尝试使用table按标记名查找元素,但运气不好。你知道吗


Tags: 数据代码fromimportdivhttp标题get
3条回答

你需要等到加载程序消失,你可以使用invisibility_of_element_located,利用WebDriverWaitexpected_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()

你应该试试这个:

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

“table”中的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(number)<;12来获取所有的raw,您还可以尝试使用50行,具体时间由您决定。你知道吗

我将使用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'])

相关问题 更多 >