Python 计算特定类的实例数并通过Selenium获取值
我正试图从中提取数据 更具体地说,我希望我的脚本计算表中的行数,并从每行中提取出勤人数(请参阅下面的图片) 查看网站,我看到第一行(12月1日)的日期如下: 及 不幸的是,这些都不起作用Python 计算特定类的实例数并通过Selenium获取值,python,selenium,xpath,web-scraping,webdriverwait,Python,Selenium,Xpath,Web Scraping,Webdriverwait,我正试图从中提取数据 更具体地说,我希望我的脚本计算表中的行数,并从每行中提取出勤人数(请参阅下面的图片) 查看网站,我看到第一行(12月1日)的日期如下: 及 不幸的是,这些都不起作用 有人能给我指出正确的方向吗?如果有人能通过计算'date ng scope'的实例数并提取相应的群组数,就如何正确计算行数提供建议,我将不胜感激。因为它是一个表,很容易实现,因为您只需不断地将表的值增加1。我就是这样做的: 从selenium导入webdriver 从selenium.webdriver.com
有人能给我指出正确的方向吗?如果有人能通过计算
'date ng scope'
的实例数并提取相应的群组数,就如何正确计算行数提供建议,我将不胜感激。因为它是一个表,很容易实现,因为您只需不断地将表的值增加1。我就是这样做的:
从selenium导入webdriver
从selenium.webdriver.common.keys导入密钥
从时间导入睡眠,strftime
url=”https://www.ushl.com/view#/schedule/24/67/12/home?league=1&gametype=-1"
webdriver=webdriver.Chrome()
webdriver.get(url)
x=0
i=2
当x==0时:
尝试:
date=webdriver。通过xpath(f)/html/body/div[5]/div[1]/div[4]/div[2]/div[1]/div/div[3]/div/div/div/div/div/div/div/ng视图/div[2]/div[3]/div[1]/table/tbody/tr[{i}]/td[1]/span]查找元素
Attention=webdriver。通过xpath(f)/html/body/div[5]/div[1]/div[4]/div[2]/div[1]/div/div[3]/div/div/div/div/div/div/div/ng视图/div[2]/div[3]/div[1]/table/tbody/tr[{i}]/td[8]/span][0]查找元素。文本
打印(f“日期{Date}当天{attention}的出席人数”)
i+=1
除:
x=1
打破
让我解释一下:
第1-3行导入必要的模块,如selenium
第4行将url设置为字符串
第5行将webdriver定义为Chrome
第6行使用Chrome打开我们前面定义的url
第7行将x定义为0。稍后while循环需要x为0
第8行将i定义为2,后面的表需要它
第9行启动一个while循环,该循环将在x为0时运行,我们在前面将其设置为0
第10行启动try命令。稍后你就会明白我们为什么需要它
第11行将日期设置为xpath变量的文本。我以前使用过html,因此我大致了解表格系统的工作原理。tr代表表行。第一天,12月1日。表是第2行。我们之前将i设置为2,因此可以使用tr[{i}]来表示2
第12行做了完全相同的事情,但是对于出席,仍然使用i,因为它是一个表。我在末尾添加了[0],因为出席的xpath是一个列表。尽管我很确定没有列表,selenium仍然这么认为,所以我决定使用[0]来获取列表的第一个元素。没有秒或第三个元素,因此[1]或[2]无法工作
第13行为用户打印信息。
第14行将i增加1,因为在下一个循环中,我们需要访问第三个表行,因此i+=1将i设置为3
我们将继续运行此操作,直到不再剩下表行。发生这种情况时,我们在第15行使用try命令来中断while循环
我希望这能解释给你听 桌子很有趣。我发现最好从外面钻进去,而不是直接进入你想要的元素。例如,行数
driver.findElements("//div[contains(@class,'table-container')]//tr")
将返回一个元素列表,获取该列表的大小将获得行数(这包括标题行,因此如果希望实际游戏数减去1)。xpath表达式被翻译为“查找类名包含字符串“table container”的任何div元素,以及该字符串的下游任何tr元素”
可以使用以下xpath找到考勤字段:
//div[contains(@class,'table-container')]//tr[2]/td[contains(@class,'attendance')]/span
其中tr[2]表示第二行。以编程方式,将“[2]”设为变量,用循环索引代替2,并迭代行计数。使用WebDriverWait()
并等待所有元素的可见性()并使用以下css选择器
识别行数,然后迭代并查找相应的列
driver.get("https://www.ushl.com/view#/schedule/24/67/12/home?league=1&gametype=-1")
totalnoofrows=WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".resp >.ht-table >tbody >tr")))
for row in totalnoofrows[1:]:
print("Date :" + row.find_element_by_xpath("./td[1]").text)
print("Crowd :" + row.find_element_by_xpath("./td[8]").text)
print("==============================================")
您需要导入以下库
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
控制台输出:
Date :Dec. 1
Crowd :872
==============================================
Date :Dec. 14
Crowd :816
==============================================
Date :Dec. 15
Crowd :1065
==============================================
Date :Dec. 16
Crowd :497
=============================================
您是否100%都需要硒元素?BeautifulSoup甚至pandas_html可能更简单。@CeliusStingher没有,但我被迫使用Selenium,因为我需要在下拉菜单上选择选项并单击按钮。我很想使用BeautifulSoup,但在选择了正确的下拉菜单项后,我需要能够更新地址。谢谢。它确实有效,但你能解释一下语法和思维过程吗?特别是在div[i]后面。我很难理解到底发生了什么。我希望这能帮助我,我想我就快到了。我很难理解您是如何获得所有这些div[I]的,我看到您确实“复制了完整的Xpath”。然而,您怎么知道必须在这两行中添加
/span
?另外,您说您知道必须为出席添加[0]
,因为attdendance的xpath是一个列表。你能详细说明一下吗?我尝试了[1]
或不同的数字来查看我会得到什么,我了解到只有[0]
会导致任何内容被打印出来。对不起,我意识到我正在做的是在我应该打印的位置上方一行“复制完整Xpath”。我仍然不明白你怎么知道你必须拥有[0]。
因为我甚至无法获得考勤=webdriver。通过xpath(f)/html/body/div[5]/div[1]/div[4]/div[2]/div[1]/div[1]/div[3]/div/div/div/div/div/ng视图/div[2]/div[3]/div[1]/table/tbody/tr[1]/td][]8]来打印该列表,我不会猜到答案的。这有帮助吗?
//div[contains(@class,'table-container')]//tr[2]/td[contains(@class,'attendance')]/span
driver.get("https://www.ushl.com/view#/schedule/24/67/12/home?league=1&gametype=-1")
totalnoofrows=WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".resp >.ht-table >tbody >tr")))
for row in totalnoofrows[1:]:
print("Date :" + row.find_element_by_xpath("./td[1]").text)
print("Crowd :" + row.find_element_by_xpath("./td[8]").text)
print("==============================================")
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Date :Dec. 1
Crowd :872
==============================================
Date :Dec. 14
Crowd :816
==============================================
Date :Dec. 15
Crowd :1065
==============================================
Date :Dec. 16
Crowd :497
=============================================