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")
使用 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")