我不熟悉网页抓取功能,需要从网站上抓取一些数据以进行研究:https://www.promedmail.org/。
我编码的是
但是,在#5上,即使我成功地使用商品ID获得了<a>
标签,也无法单击链接。错误消息显示:
selenium.common.exceptions.ElementNotInteractableException:消息:元素无法滚动到视图中
经过研究,我认为我需要滚动到该链接,因为该链接不可见。我尝试了5种在stackoverflow中建议的不同解决方案,但这些解决方案都对我没有真正的作用,我被卡住了。它们在下面的代码中列出并被注释掉。
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'
webscrapper = WebScraper(url, keyword)
webscrapper.get_all_data()
单击链接后,将在右侧面板上弹出预览。我打算剪贴文章,并移至下一个链接。
答案 0 :(得分:0)
快速解决方案: 您可以使用以下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()