我正在检索VividSeats网站以获取机票信息。
url ='https://www.vividseats.com/nhl-hockey/los-angeles-kings-tickets/kings-vs-canucks-2-14-2751065.html'
我正在使用Selenium和Python。 我可以使用Chrome Webdriver转到页面,然后单击出现的弹出窗口。我尝试在
下的左侧刮取票证信息<ul class='ticket-rows'>
通过使用driver.find_elements_by_class_name.
但是,它只是刮擦列表的前半部分。向下滚动框架后,将出现更多票证。显然,只是刮刮并没有得到那张票的下半部分。
我尝试获取票证类别,然后使用
import Keys
send_keys(Keys.END)
在元素上的滚动到框架的末尾,然后刮取票证。但是我不断得到
WebDriverException: Message: unknown error: cannot focus element
错误。
我正在寻找框架,但是没有iframe可供我切换。这是页面内的嵌入式框架,我无法切换到该框架以滚动到页面底部。
我需要做些什么才能滚动到此框的底部,以便我可以刮取门票?我不是在问如何抓取,而是想知道如何将其滚动到最后
谢谢
编辑:我已按照@ DebanjanB的要求尝试过包含的代码
从selenium.webdriver.common.keys导入密钥
1)
scroll = driver.find_element_by_class_name('value-score')
scroll.click()
scroll.send_keys(Keys.END)
2)
scroll = driver.find_element_by_class_name('row-container')
scroll.send_keys(Keys.END)
3)
scroll = driver.find_element_by_class_name('row')
scroll.send_keys(Keys.END)
他们最终都返回错误
WebDriverException: Message: unknown error: cannot focus element
答案 0 :(得分:0)
如果要剪贴整个列表,则需要向下滚动,否则元素将不可见。
因此,请尝试下面的代码,该代码将首先向下滚动,直到没有剩余元素,然后检索信息并为您打印。
// Some driver initialization code
driver.get("https://www.vividseats.com/nhl-hockey/los-angeles-kings-tickets/kings-vs-canucks-2-14-2751065.html");
driver.findElement(By.xpath("//button[text()='SKIP']")).click();
String xPath = "//ul[@class='ticket-rows']/article";
// Getting initial visible rows
List<WebElement> rows = driver.findElements(By.xpath(xPath));
while(true) {
// Scrolling down to the last row so that remaining rows get visible
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", rows.get(rows.size()-1));
// Getting latest loaded visible rows count
List<WebElement> tempRows = driver.findElements(By.xpath(xPath));
// System.out.println(rows.size()+" <<<===>>> "+tempRows.size());
// If the latest rows count is greater than the previous rows count then we need to do the scroll down again otherwise break the loop
if(tempRows.size() > rows.size()) {
rows = tempRows;
} else {
break;
}
}
// Printing the name and the price, you can change it to your convenience
List<WebElement> data = driver.findElements(By.xpath(xPath+"//strong"));
for(WebElement element : data) {
System.out.println(element.getText().trim());
}
下面是Python中的端到端代码:
from selenium import webdriver
driver = webdriver.Chrome('C:\\NotBackedUp\\chromedriver.exe')
driver.get('https://www.vividseats.com/nhl-hockey/los-angeles-kings-tickets/kings-vs-canucks-2-14-2751065.html')
popUp = driver.find_element_by_xpath("//button[text()='SKIP']");
popUp.click()
xPath = "//ul[@class='ticket-rows']/article";
rows = driver.find_elements_by_xpath(xPath)
while True:
driver.execute_script("arguments[0].scrollIntoView(true);", rows[-1])
tmpRows = driver.find_elements_by_xpath(xPath)
if len(tmpRows) > len(rows) :
rows = tmpRows
else:
break
for element in driver.find_elements_by_xpath(xPath+"//strong"):
print(element.text)
print("Done...")
希望对您有帮助...