我有一个网页,其中包含一个表格,该表格仅在我单击“检查元素”时出现,并且在查看源页面中不可见。该表仅包含两行,每行有几个单元格,看起来类似于此:
<table class="datadisplaytable">
<tbody>
<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>
</tbody>
</table>
我试图做的是遍历行并返回每个单元格中包含的文本。我似乎真的不能用Selenium来做到这一点。元素不包含ID,我不知道如何获取它们。我不太熟悉使用xpath之类的。
这是一个返回TypeError
的调试尝试:
def check_grades(self):
table = []
for i in self.driver.find_element_by_class_name("dddefault"):
table.append(i)
print(table)
从行中获取文本的简单方法是什么?
更正@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']")])
注意:末尾缺少一个圆括号;还删除了[1]索引,以匹配第一个XML示例。
另一个注意事项:尽管如此,也应该保留索引为[1]的示例,以显示如何提取单个元素。
如果要使用xpath逐行访问,可以使用以下选项:
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()])
其输出:
['16759', 'MATH', '123', '001', 'Calculus']
['16449', 'PHY', '456', '002', 'Physics']
使用td[text()]
将避免为不包含文本的td返回任何Nones。
所以要使用硒做同样的事情,你可以:
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]"])
对于多个表:
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很脆弱。最好使用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)
因此,我一直在努力通过selenium找到一种动态方法,即遍历一个表并从该表中收集特定值,以创建从远程服务到本地数据标签的映射。下面是我试图迭代的代码,这些长度可能会改变: 我确信有一种方法可以在表中进行迭代,以动态的方式收集值,这样应该只需要: 字符串fee**“x”**=driver.findElement(by.xpath(“//tr//input[@id='feed']”)).getAtt
我正在使用XPath/CSS和Selenium来定位网站上的元素。我想创建一个方法,在这个方法中,我遍历一个定位器列表(XPath/CSS),然后程序选择哪个有效。换句话说,它从定位器1开始-如果定位器存在,它将返回true并存在循环。否则,它将移动到列表中的下一个定位器。一旦用完所有CSS定位器,它就会转到XPath等等。 目前,我正在考虑如下实施: 然后,我计划为每种定位器类型调用此方法(一次
问题内容: 我是一个selenium菜鸟,一直在努力用python完成事情。我试图从此页面迭代所有用户评论(“ partial_entry”类)https://www.tripadvisor.com/Airline_Review-d8729164-Reviews- Cheap-Flights-or560-TAP- Portugal#REVIEWS 即使Im每次都在for循环中选择一个不同的元素,但
问题内容: 我想遍历一个webelements列表并从每个元素中返回文本,但是我只从第一个元素而不是从其他标记内的其余元素中获取文本,然后存在存在该循环的代码 这是我要从中提取文本的HTML代码的一部分: 这是Pyhton代码: 问题答案: 一直在我的脸上,这将打印每个元素的文本,很高兴我能发现
问题内容: 我创建了一个二维数组,如: 打印此列表将给出输出: 其中每个列表项都是“行,列”格式的字符串 现在给出此列表,我想按顺序迭代它: 依次遍历第一列和第二列,依此类推。我该如何循环? 此问题与纯python列表有关,而标记为相同的问题与numpy数组有关。他们明显不同 问题答案: 使用和。就像是:
我试图在Java中使用Selenium遍历一个表(目前使用的是chromedriver)。该表的内容由不同的人组成,他们的个人资料有链接,对于该表中的每个人,我将进入他们的个人资料并提取一些信息。我将为X数量的人做这件事。该表每页包含5人,我通过单击分页按钮浏览页面” 现在来看这个问题:举个例子,我现在在exampleUrl。com/page\u包含表I,然后输入用户的配置文件并提取他们的信息,他