Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Selenium中选择表格单元格中的所有文本_Python_Selenium_Xpath - Fatal编程技术网

Python 如何在Selenium中选择表格单元格中的所有文本

Python 如何在Selenium中选择表格单元格中的所有文本,python,selenium,xpath,Python,Selenium,Xpath,尝试编写一个简单的脚本,为我提供一个表的所有单元格内容 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

尝试编写一个简单的脚本,为我提供一个表的所有单元格内容

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>

产品
车辆
价格
评级
期间
乳胶
62
5.
超级油漆
乳胶
56
4.
A-100
乳胶
48
3.
大氧
环氧树脂
62
5.

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

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:]]
这样,您的目标就很容易实现:


我的最终目标是做一些类似于打印td[2]的事情,其中td[4]大于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']

我的最终目标是做一些类似于打印td[2]的事情,其中td[4]大于3。您能给我们显示变量表的内容吗?它是什么类型?您希望
type(表[0])==WebElement
还是
type(表[0])==str
?您给出的示例可以更容易地使用和处理。除非您确信需要selenium的浏览器自动化功能,否则最好使用这些接口。
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']