Saltar al contenido

Iterando a través de filas de tablas en Selenium (Python)

Solución:

Si desea ir fila por fila usando un xpath, puede usar lo siguiente:

h  = """<table class="datadisplaytable">
<tr>
<td class="dddefault">16759</td>
<td class="dddefault">MATH</td>
<td class="dddefault">123</td>
<td class="dddefault">001</td>
<td class="dddefault">Calculus</td>
<td class="dddefault"></td>
<td class="dddead"></td>
<td class="dddead"></td>
</tr>
<tr>
<td class="dddefault">16449</td>
<td class="dddefault">PHY</td>
<td class="dddefault">456</td>
<td class="dddefault">002</td>
<td class="dddefault">Physics</td>
<td class="dddefault"></td>
<td class="dddead"></td>
<td class="dddead"></td>
</tr>
</table>"""

from lxml import html
xml = html.fromstring(h)
# gets the table
table =  xml.xpath("//table[@class="datadisplaytable"]")[0]


# iterate over all the rows   
for row in table.xpath(".//tr"):
     # get the text from all the td's from each row
    print([td.text for td in row.xpath(".//td[@class="dddefault"][text()])

Qué salidas:

['16759', 'MATH', '123', '001', 'Calculus']
['16449', 'PHY', '456', '002', 'Physics']

Utilizando td[text()] evitará que se devuelvan Nones para los td que no contienen texto.

Entonces, para hacer lo mismo usando selenio, haría lo siguiente:

table =  driver.find_element_by_xpath("//table[@class="datadisplaytable"]")

for row in table.find_elements_by_xpath(".//tr"):
    print([td.text for td in row.find_elements_by_xpath(".//td[@class="dddefault"][1]"])

Para varias tablas:

def get_row_data(table):
   for row in table.find_elements_by_xpath(".//tr"):
        yield [td.text for td in row.find_elements_by_xpath(".//td[@class="dddefault"][text()]"])


for table in driver.find_elements_by_xpath("//table[@class="datadisplaytable"]"):
    for data in get_row_data(table):
        # use the data

XPath es frágil. Es mejor usar selectores o clases de CSS:

mytable = find_element_by_css_selector('table.datadisplaytable')
for row in mytable.find_elements_by_css_selector('tr'):
    for cell in row.find_elements_by_tag_name('td'):
        print(cell.text)

Corrección de la parte de selenio de la respuesta de @Padraic Cunningham:

table = driver.find_element_by_xpath("//table[@class="datadisplaytable"]")

for row in table.find_elements_by_xpath(".//tr"):
    print([td.text for td in row.find_elements_by_xpath(".//td[@class="dddefault"]")])

Nota: faltaba un corchete redondo al final; también eliminó el [1] index, para que coincida con el primer ejemplo XML.

Otra nota: aunque, el ejemplo con el índice [1] también debe conservarse, para mostrar cómo extraer elementos individuales.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *