当前位置: 首页 > 知识库问答 >
问题:

使用Python Selenium进行网络抓取:无法找到元素并滚动,出现“无法聚焦元素”错误

吕成业
2023-03-14

我正在网站上搜寻机票信息。

url='https://www.vividseats.com/nhl-hockey/los-angeles-kings-tickets/kings-vs-canucks-2-14-2751065.html'

我正在使用Selenium和Python。我可以使用ChromeWebDriver进入页面,然后单击弹出窗口。我试着把左边的票证信息刮到下面

<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要求我尝试的代码

来自硒。网络驱动程序。常见的关键点导入关键点

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

共有1个答案

孔理
2023-03-14

如果您想删除整个列表,则需要向下滚动,否则元素将不可见。

所以尝试下面的代码,它会先向下滚动,直到没有元素留下,然后为你检索信息和打印。

// 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...")

我希望它能帮助。。。

 类似资料:
  • 问题内容: 我的 JavaScript 行: 我的 webdriver 代码行: 当我运行测试时,它将引发以下异常: 因此,我一直在寻找解决方案。铬Google代码网站中报告了一些问题。有关使用,有很多建议。但这对我来说似乎不是更好的解决方案,因为它可以使浏览器依赖代码。 问题答案: 几个小时后,我终于找到了使用不带JavascriptExecuter的操作的解决方案: 好吧,它为我工作。但是,这

  • 我正在从包含javascript(评论)的丝芙兰网站上抓取产品评论,但我无法抓取。这是我的代码: 输出为: 回溯(最近的最后一次调用):文件"resgt.py",第15行,在审查中=driver.find_element_by_class_name('css-1jg2pb9 eanm77i0')文件"/home/danish-khan/minicon da3/lib/python3.7/site-

  • 我正在尝试用Selenium选择一个值。 你能帮我纠正一下情况吗?

  • 我一直试图使用Selenium sendkeys(),但没有成功使用Chrome。我在这里研究过类似的问题,但似乎没有成功。我可以生成URL,调用按钮(click()),但是当我试图在特定的文本字段中输入值时,我会得到: 线程“main”org.openqa.selenium.WebDriverException中出现异常:未知错误:无法聚焦元素。

  • 我正在尝试使用java和Eclipse学习Selenium。我试图找到网页中的一个元素。 我尝试使用这行代码单击一个html元素: 下图显示了页面的html结构:

  • 问题内容: 我正在尝试抓取以下网站:https : //www.bancosantander.es/es/particulares/prestamos/prestamo- coche/simulador 我正在尝试做的是: 通过移动滑块来模拟数量和持续时间。我正在尝试使用网络驱动程序找到它们。 但是我不能,事实上我已经开始抓取了。 出现的错误如下: 我的代码: 问题答案: 您可以尝试以下方法输入值