Extract/Save 元素的文本和图像与 Selenium

Extract/Save Element's Text AND Images with Selenium

使用 Windows、Python 3 和 Selenium/Chromedriver,我试图找到一种方法将元素的数据(文本和图像)保存到离线文件中稍后查看。我尝试过的事情:

1.将页面源保存到 .html 文件

    page_source = driver.page_source
    with open("page.html", "w", encoding="utf-8") as file:
        file.write(page_source)

问题是,它只保存页面的文本,而不是图像,只是在保存的页面上呈现空图像占位符,而不是实际图像。

2。全页截图

    page_width = driver.execute_script('return document.body.scrollWidth')
    page_height = driver.execute_script('return document.body.scrollHeight')
    driver.set_window_size(page_width, page_height)
    driver.save_screenshot("page.png")

这里的问题是,即使我正在定义整个页面 height/width,也只有页面的可见部分被截屏,而不是整个页面的数据,因此需要滚动合并。

3。使用取自 this answer

的“select 全部”类型逻辑

这是一种棘手的解决方法,但可以工作,但正在寻找更好的解决方案。

4。利用按 CTRL + S 保存页面和资产以供离线查看

这没问题,但是它将一堆内容下载到呈现整个页面所需的单独文件夹中,我认为这不是必需的,因为我只需要页面上一个元素的内容。另外,我将下载多个页面,我也不希望每个页面都有单独的文件夹。

所以我想知道是否有更好的方法来保存页面元素的文本和图像,最好是 html、docx 或 pdf 文件类型?我已经在 SO 上看到了各种解决方案,但还没有找到可以做到这一点的解决方案,所以在正确的方向上寻找一些 direction/steer 我。谢谢!

此代码截取元素 #mp-topbanner 的屏幕截图并打印其中包含的文本

driver.get('https://en.wikipedia.org/wiki/Main_Page')
element = driver.find_element(By.CSS_SELECTOR, '#mp-topbanner')
element.screenshot('screen.png')
print(element.text)

输出

Welcome to Wikipedia,
the free encyclopedia that anyone can edit.
6,498,975 articles in English

我最终使用 CTRL + A、CTRL + C 复制了整个页面中的所有文本和图像。然后我使用 win32clipboard 从剪贴板中访问数据,并将其导出到 docx 文件。有点 hacky,并不仅仅从元素中获取内容,但它适用于我的目的。也许以后会有人有更好的解决办法。

a = ActionChains(driver)
a.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
sleep(1)
a.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

current_books_pages_list = []
while True:
    try:
        win32clipboard.OpenClipboard()
        data = win32clipboard.GetClipboardData()
        win32clipboard.CloseClipboard()
        current_books_pages_list.append(data)
        print("Woohoo!")
        break
    except:
        print("Clipboard access denied error, trying again...")
        sleep(1)
        continue

with open("books/" + str(book_name_string) + ".docx", "a", encoding="utf-8") as file:
    for page_data in current_books_pages_list:
        file.write(page_data)
        file.write("\n")