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)