无法使用python selenium从表中提取值

无法使用python selenium从表中提取值,python,selenium,web-scraping,Python,Selenium,Web Scraping,首先,我从不同的下拉菜单中选择选项,然后单击show按钮,然后尝试从html表中提取值时,没有找到任何元素。你知道为什么吗 driver = webdriver.Chrome('/Users/Administrador/Documents/chromedriver') main_url = 'https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html' driv

首先,我从不同的下拉菜单中选择选项,然后单击show按钮,然后尝试从html表中提取值时,没有找到任何元素。你知道为什么吗

driver = webdriver.Chrome('/Users/Administrador/Documents/chromedriver')
main_url = 'https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html'
driver.get(main_url)

# This works perfectly
driver.switch_to.frame("topFrame")

dropdown_secciones = driver.find_element_by_xpath('./html/body/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td[2]/select')

select_box_secciones = Select(dropdown_secciones)
select_box_secciones.select_by_value("1|308")


dropdown_circuitos = driver.find_element_by_xpath('//*[@id="cmbCircuitos"]')
select_box_circuitos = Select(dropdown_circuitos)
select_box_circuitos.select_by_index(1)

mostrar_click = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[3]/td/div/input[1]')
mostrar_click.click()

driver.switch_to.default_content()
driver.switch_to.frame('mainFrame')

# This doesn´t work. No element is found. 
for r in range(8,35): #from row 8 up to row 35
    for c in range(3,7): #starting in column 3 up to column 7
        value = driver.find_element_by_xpath('/html/body/table/tbody/tr["+str(r)+"]/td["+str(c)+"]').text
        print(value)


尝试从表中提取值时未找到任何元素

我看了一下表,问题是有些行可能有空列(尝试获取tr[9],您就会明白我的意思

另外,对于包含3列值的行,您可能已经知道,有些行的td元素比其他行少

因此,您可以保留8-35范围,但在此范围内,您可以使用以下xpath获取所有实际包含文本的列(使用find_元素获取列表)


xpath应该始终为您提供3个元素,每列一个元素,其中包含文本。如前所述,某些行将为空,但您可以轻松处理,因为列结果将为0计数。

我查看了该表,问题是某些行可能有空列(尝试获取tr[9]),您将了解我的意思

另外,对于包含3列值的行,您可能已经知道,有些行的td元素比其他行少

因此,您可以保留8-35范围,但在此范围内,您可以使用以下xpath获取所有实际包含文本的列(使用find_元素获取列表)


xpath应该始终为您提供3个元素,每个元素对应于文本为的列。如前所述,某些行将为空,但您可以轻松处理,因为列的结果将为0计数。

下面是一段您可能感兴趣的代码

我认为,与xpath操作相比,使用BeautifulSoup进行html解析会更好

下面代码的思想是:

  • 一旦我们切换到“大型机”,等待“表”出现
  • 对于每个“tr”元素,查找其中具有“class”属性的所有“td”元素(因为这些元素包含数据)
  • 如果“td”元素的数量为3,则获取此数据
这种方法的优点:

  • 你们不需要知道具体的时间,直到桌子出现
  • 您不需要知道具体的行数、开始或结束的索引
换句话说,这完全是相对的

从selenium.webdriver.support.ui导入选择
从selenium导入webdriver
从bs4导入BeautifulSoup
导入时间
url=”https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html"
driver=webdriver.Chrome(“C:\\path\\to\\chromedriver.exe”)
获取驱动程序(url)
驱动开关切换到框架(“顶部框架”)
select\u box\u secciones=select(driver.find\u element\u by_id('cmbSecciones'))
select\u box\u circuitos=select(driver.find\u element\u by\u id('cmbCircuitos'))
mostrar=driver.find_element_by_id('cmdMostrar'))
选择方框。按值选择(“1 | 308”)
选择方框电路。按索引选择(1)
mostrar.click()
driver.switch_to.default_content()
驱动程序.切换到.frame('大型机')
“表”不在driver.page\u源中时:
睡眠时间(0.1)
soup=BeautifulSoup(driver.page_源代码,“html.parser”)
对于汤中的tr。查找('table')。查找所有('tr'):
row=tr.find_all(lambda td:td.has_attr('class'))
如果(len(row)==3)和(row[0]。text!=“Nº”):
数据=[td.text代表第行中的td]
打印(数据)
driver.quit()
上述脚本的输出为:

['P22', 'PARTIDO HUMANISTA', '117']
['A500', 'CORDOBA CAMBIA', '2.999']
['P217', 'ENCUENTRO VECINAL CÓRDOBA', '786']
['20', 'UNIÓN DEL CENTRO DEMOCRÁTICO (U.CE.DE.)', '21']
['3', 'UNIÓN CÍVICA RADICAL', '1.053']
['A830', 'FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES', '611']
['P238', 'MOVIMIENTO AVANZADA SOCIALISTA', '35']
['A601', 'HACEMOS POR CORDOBA', '4.059']
['P57', 'MOVIMIENTO DE ACCIÓN VECINAL', '31']
['P191', 'VECINALISMO INDEPENDIENTE', '152']
['P200', 'PARTIDO UNION CIUDADANA', '135']
['A300', 'MST - NUEVA IZQUIERDA', '329']

下面是一段您可能感兴趣的代码

我认为,与xpath操作相比,使用BeautifulSoup进行html解析会更好

下面代码的思想是:

  • 一旦我们切换到“大型机”,等待“表”出现
  • 对于每个“tr”元素,查找其中具有“class”属性的所有“td”元素(因为这些元素包含数据)
  • 如果“td”元素的数量为3,则获取此数据
这种方法的优点:

  • 你们不需要知道具体的时间,直到桌子出现
  • 您不需要知道具体的行数、开始或结束的索引
换句话说,这完全是相对的

从selenium.webdriver.support.ui导入选择
从selenium导入webdriver
从bs4导入BeautifulSoup
导入时间
url=”https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html"
driver=webdriver.Chrome(“C:\\path\\to\\chromedriver.exe”)
获取驱动程序(url)
驱动开关切换到框架(“顶部框架”)
select\u box\u secciones=select(driver.find\u element\u by_id('cmbSecciones'))
select\u box\u circuitos=select(driver.find\u element\u by\u id('cmbCircuitos'))
mostrar=driver.find_element_by_id('cmdMostrar'))
选择方框。按值选择(“1 | 308”)
选择方框电路。按索引选择(1)
mostrar.click()
driver.switch_to.default_content()
驱动程序.切换到.frame('大型机')
“表”不在driver.page\u源中时:
睡眠时间(0.1)
soup=BeautifulSoup(driver.page_源代码,“html.parser”)
对于汤中的tr。查找('table')。查找所有('tr'):
row=tr.find_all(lambda td:td.has_attr('class'))
如果(len(row)==3)和(row[0]。text!=“Nº”):
数据=[td.text代表第行中的td]
打印(数据)
driver.quit()
上述脚本的输出为:

['P22', 'PARTIDO HUMANISTA', '117']
['A500', 'CORDOBA CAMBIA', '2.999']
['P217', 'ENCUENTRO VECINAL CÓRDOBA', '786']
['20', 'UNIÓN DEL CENTRO DEMOCRÁTICO (U.CE.DE.)', '21']
['3', 'UNIÓN CÍVICA RADICAL', '1.053']
['A830', 'FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES', '611']
['P238', 'MOVIMIENTO AVANZADA SOCIALISTA', '35']
['A601', 'HACEMOS POR CORDOBA', '4.059']
['P57', 'MOVIMIENTO DE ACCIÓN VECINAL', '31']
['P191', 'VECINALISMO INDEPENDIENTE', '152']
['P200', 'PARTIDO UNION CIUDADANA', '135']
['A300', 'MST - NUEVA IZQUIERDA', '329']

嘿!非常感谢你的回答。我已经尝试了你的代码,但仍然没有得到任何输出。也许我没有正确地切换帧?这是切换帧时(从表中提取元素之前)得到的输出:page=driver.page\u源页面输出:“”奇怪,列0的计数是否正确?我认为您的切换很好-如果没有最后两个开关,我无法获取元素。让我们尝试一个更简单的方法,如果您尝试
text=driver。通过xpath('/html/body/table/tbody/tr[8]/td[text()])[0]查找元素会发生什么情况.text
。请在最后一次切换后尝试此操作,即不在for循环中。我正在使用c#和chromedriver,但我有您的等效代码,它对我有效。Inde