gpt4 book ai didi

python - ElementNotInteractableException : Message: Element could not be scrolled into view

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:47 26 4
gpt4 key购买 nike

我是网络抓取新手,需要从网站上抓取一些数据以进行研究:https://www.promedmail.org/ .

我编码的是

  1. 访问网站
  2. 点击搜索标签
  3. 输入关键字(埃博拉病毒)
  4. 点击“搜索”以填充搜索结果
  5. 点击第一个链接即可在右侧面板上填充预览

View website image

但是,在#5 上,即使我成功获得了<a>,我也无法单击该链接。使用文章 ID 进行标记。错误消息显示:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <a id="id6519943" class="lcl" href="javascript:;"> could not be scrolled into view

经过一番研究,我认为我需要滚动到该链接,因为该链接不可见。我尝试了 stackoverflow 中建议的 5 种不同的解决方案,但没有一个真正适合我,我陷入了困境。它们在下面的代码中列出并被注释掉。

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

class WebScraper:
"""Custome web scraper"""
def __init__(self, url, keyword):
self.url = url
self.keyword = keyword

self.search_results = []
self.ariticle_ids = []

def get_all_data(self):
"""Get beautiful soup objects for all articles"""

driver = webdriver.Firefox()
driver.get(self.url)
driver.find_element_by_id('search_tab').click()
driver.find_element_by_id('searchterm').send_keys(self.keyword)
driver.find_element_by_css_selector('#searchby_other > input[type=submit]').click()

element_article_id = driver.find_element_by_css_selector('#search_results > ul')
source_article_id = element_article_id.get_attribute('outerHTML')
soup_article_id = BeautifulSoup(source_article_id, 'html.parser')
tag_a = soup_article_id.select('ul > li > a[id]')
for i in range(len(tag_a)):
self.ariticle_ids.append(tag_a[i].get('id'))

element_link = driver.find_element_by_id(self.ariticle_ids[0])

# driver.execute_script("arguments[0].scrollIntoView();", element_link)
# driver.execute_script("window.scrollBy(0, -150);")
# element_link.location_once_scrolled_into_view
# ActionChains(driver).move_to_element(driver.find_element_by_id(self.ariticle_ids[0])).perform()
# WebDriverWait(driver, 1000000).until(EC.element_to_be_clickable((By.ID, self.ariticle_ids[0]))).click()

element_link.click()

if __name__ == "__main__":
url = 'https://www.promedmail.org/'
keyword = 'ebola'
webscraper = WebScraper(url, keyword)
webscraper.get_all_data()

单击链接时,右侧面板上会弹出预览。我打算抓取这篇文章并转到下一个链接。

最佳答案

快速解决方案:您可以使用 JavaScript 单击该链接,如下所示。

driver.execute_script("arguments[0].click()",driver.find_element_by_id(ariticle_ids[0]))

根本原因:好吧,我们在 html 中找到了 2 个与 id 匹配的元素。第一个位于latest_alerts 下,当您搜索结果时,它会被隐藏。第二个是显示在搜索结果下屏幕中的那个。这就是为什么您无法滚动到该元素的原因,因为当存在多个具有匹配 id 的实例时,find_element_by_id 将获取第一个实例。

您可以使用下面的代码行来确认这一点。

print(len(driver.find_elements_by_id(self.ariticle_ids[0]))).

解决方案:如果您想滚动到搜索结果中的元素然后单击它,则可以使用下面的

element_link = driver.find_elements_by_id(self.ariticle_ids[0])[-1]
element_link.location_once_scrolled_into_view
element_link.click()

关于python - ElementNotInteractableException : Message: Element <a> could not be scrolled into view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com