如何在Selenium中选择表格单元格内的所有文本
我正在尝试写一个简单的脚本,想要获取一个表格中所有单元格的内容。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'http://127.0.0.1/html5css3'
driver = webdriver.Firefox()
driver.get(url)
table = driver.find_elements_by_xpath("//td//text()")
for t in table:
print t
我还没有找到一个关于xpath语法的教程,能够从基础到高级都讲解清楚。
示例输入:
<table border="1">
<tr>
<td>Product</td>
<td>Vehicle</td>
<td>Price</td>
<td>Rating</td>
</tr>
<tr>
<td>Duration</td>
<td>Latex</td>
<td>62</td>
<td>5</td>
</tr>
<tr>
<td>Super Paint</td>
<td>Latex</td>
<td>56</td>
<td>4</td>
</tr>
<tr>
<td>A-100</td>
<td>Latex</td>
<td>48</td>
<td>3</td>
</tr>
<tr>
<td>Macropoxy</td>
<td>Epoxy</td>
<td>62</td>
<td>5</td>
</tr>
</table>
1 个回答
3
当我运行你的程序时,出现了这个错误信息:
这个 xpath 表达式 "//td//text()" 的结果是: [object XrayWrapper [object Text]]。它应该是一个元素。
果然,当我在 lxml
中运行这个表达式时,我得到了一个字符串的列表。
显然,.find_elements*
只想返回网页元素;它们不想返回字符串。
根据你的具体需求,可以尝试以下几种方法:
list_of_elements = driver.find_elements_by_xpath('//td') # return elements
list_of_text = [t.text for t in driver.find_elements_by_xpath('//td')] # return strings
不过,如果是我,我会希望结果中有一些结构:
list_of_lists = [[td.text
for td in tr.find_elements_by_xpath('td')]
for tr in driver.find_elements_by_xpath('//tr')]
list_of_dicts = [dict(zip(list_of_lists[0],row)) for row in list_of_lists[1:]]
这样一来,你的目标就容易实现了:
我最终的目标是做类似于打印 td[2],前提是 td[4] 大于 3。
print [row['Vehicle'] for row in list_of_dicts if int(row['Rating']) > 3]
这里有一个最终的程序,可能会满足你的需求:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'file:///tmp/x.html'
driver = webdriver.Firefox()
driver.get(url)
list_of_lists = [[td.text
for td in tr.find_elements_by_xpath('td')]
for tr in driver.find_elements_by_xpath('//tr')]
list_of_dicts = [dict(zip(list_of_lists[0],row)) for row in list_of_lists[1:]]
for t in list_of_dicts:
if int(t['Rating']) > 3:
print t['Vehicle']