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_Web Scraping_Webdriverwait - Fatal编程技术网

Python 计算特定类的实例数并通过Selenium获取值

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

我正试图从中提取数据

更具体地说,我希望我的脚本计算表中的行数,并从每行中提取出勤人数(请参阅下面的图片)

查看网站,我看到第一行(12月1日)的日期如下:

不幸的是,这些都不起作用


有人能给我指出正确的方向吗?如果有人能通过计算
'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
=============================================