如何使用selenium-webdriver(python)选择、复制和粘贴元素中的所有内容



这基本上是我要做的。我有两个网站,网站A包含我需要转移到网站B的数据。本质上是

由于网站A即将关闭,我正在将数据从网站A迁移到B很快

我需要移动的不仅仅是文本,它可以是文本、图像或超链接文本,还有一些格式的东西我需要保留。我认为最简单的方法是复制并过去,而不是以一种允许我将其插入网站B的方式存储所有这些数据,就像复制并粘贴一样。在我制作代码解决方案之前,他们只是从a到B的所有内容进行复制和粘贴。现在我已经在代码中实现了所有内容(获取链接和其他所需内容(,但我无法移动数据。所以,基本上,在我尝试复制和粘贴数据之前,我要做的是这样的。我使用的是python 3。

original_window = driver.current_window_handle
driver.execute_script("window.open()")
wait.until(EC.number_of_windows_to_be(2))
driver.switch_to.window(driver.window_handles[1])
actURL = a.getlink()
driver.get(actURL)
e = a.getactivitydata(driver)
driver.close()
driver.switch_to.window(driver.window_handles[0])

这里A是一个自定义对象,有一个方法get-link,它返回到我需要数据的网站A的链接。A还包含方法getactivitydata,我想在这里选择、复制并返回驱动程序。方法代码为

def getactivitydata(self, driver):
r = driver.page_source
soup = BeautifulSoup(r, 'html.parser')  # Raw html obj
ty = self.typef
if ty == 'page':
elem = driver.find_element_by_id("page-content")
end = driver.find_element_by_class_name('course-nav')
a = ActionChains(driver)
#elem.send_keys("bar")
a.move_to_element(elem)
a.click_and_hold().perform()
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
a.move_to_element(end)
a.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
#elem.send_keys(Keys.CONTROL, 'a')  # Select all
#elem.send_keys(Keys.CONTROL, 'c')  # Copy
return(elem)
elif ty == 'quiz':
pass
elif ty == 'assign':
pass
elif ty == 'folder':
pass
elif ty == 'glossary':
pass
elif ty == 'resource':
pass
elif ty == 'forum':
pass

ty表示页面的类型,因为每个页面都需要稍微不同的处理方式。我想做的基本上是选择HTML内部的所有文本和图像,元素id为"页面内容"。当运行代码时(与许多其他有效的代码一起运行(,我得到了以下异常

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

这个异常是在我试图实际复制我需要的数据的行上提出的。

实际包含文本的元素是<h1,<h2…等等(它关闭了>,这是我第一次发帖,我不知道如何在关闭的情况下获得堆栈溢出来显示它(图片包含在<img,如果我以某种方式运行一个循环,遍历所有的页面并突出显示它们,然后复制和粘贴,我将如何做到这一点保留图像在文本中显示的顺序,以及我将如何获得<hn,因为每一页都会有所不同。我尝试了一些不同的元素/方法来尝试选择和复制文本,但到目前为止,我还无法成功突出显示任何文本(我可以直观地看到,我使用chrome webdriver 89(。

它们所属的最小HTML标记是<div class=";行";并且即使在文本/图像的基本单个框上也存在多行。

欢迎任何帮助或指导,我并不反对使用复制/粘贴以外的其他方法,但我确实需要它在网站B上输出,就像它是复制/粘贴的一样。还有一些类型的页面有多个独立的元素,(比如在线测验,你有问题1,a(,b…(…问题2(等等…(谢谢

所以,只要更新任何试图做同样事情的人。点击拖动不起作用,起作用的是

a = ActionChains(driver)
#elem.send_keys("bar")
elem = driver.find_element(By.ID, "maincontent")
#wait = WebDriverWait(driver, 10)
#first = wait.until(EC.element_to_be_clickable(elem))
a.move_to_element_with_offset(elem, 0, 0)
a.key_down(Keys.SHIFT)
a.double_click(elem).double_click(elem)
end = driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[3]')
a.move_to_element(end).double_click(end)
a.key_up(Keys.SHIFT)
a.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

基本上,我在这里所做的是在元素的开头和它下面的另一个元素处按住shift和quad-click(我认为从技术上讲,3可以做到(,我试图实现和偏移,但无法使其工作

最新更新