【问题标题】:How to select all text in table cells in Selenium如何在 Selenium 中选择表格单元格中的所有文本
【发布时间】:2014-08-04 01:40:00
【问题描述】:

尝试编写一个简单的脚本来给我一个表格的所有单元格内容。

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>

【问题讨论】:

  • 我的最终目标是做类似 PRINT td[2] where td[4] is greater than 3
  • 你能告诉我们变量表的内容吗?它是什么类型的?
  • 您希望type(table[0]) == WebElement 还是type(table[0])==str
  • 使用requestsxml.etree.elementtree 可以更轻松地处理您给出的示例。除非您确信自己需要 selenium 的浏览器自动化功能,否则最好使用这些接口。

标签: python selenium xpath


【解决方案1】:

当我运行您的程序时,我收到以下错误消息:

xpath 表达式“//td//text()”的结果是:[object XrayWrapper [object Text]]。它应该是一个元素。

果然,当我在lxml 中运行那个表达式时,我得到了一个字符串列表。

显然,.find_elements* 只想返回 WebElements;他们不想返回字符串。

根据您的更高要求,尝试以下方法之一:

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:]]

这样,您的目标就很容易实现了:

我的最终目标是做类似 PRINT 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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多