我通过下载外部资源(图片)并替换它们的src
属性来创建这个程序。
假设我想将所有<img>
标签中的图像保存到相对于当前页面的../images
路径下。
~/site
~/site/pages/
~/site/pages/page1.html
~/site/pages/page2.html
~/site/images/
~/site/images/img_for_page1.png
~/site/images/img_for_page2.png
我使用requests模块下载图片。
from selenium import webdriver
import requests
...
with open("replace_img_srcs.js", 'r') as file:
replace_img_srcs_js = file.read()
save_dir = "/home/user/site"
save_to_file = "/home/user/site/pages/page1.html"
img_tags = driver.find_elements(By.TAG_NAME, "img")
for img_tag in img_tags:
img_src = img_tag.get_attribute("src")
r = requests.get(img_src, allow_redirects=True)
img_filename = img_src.rsplit('/', 1)[1]
open(save_dir + "/images/" + img_filename, 'wb').write(r.content)
driver.execute_script(replace_img_srcs_js)
with open(save_to_file, 'w') as f:
f.write(driver.page_source)
这段代码编辑了src属性。我将它放在一个单独的文件中,以便能够看到语法高亮。如果您愿意,可以直接将其内容放置在driver.execute_script(...)
中。
Array.prototype.slice.call(document.getElementsByTagName('img')).forEach(
function(item) {
var img_src = item.src;
var img_filename = img_src.replace(/^.*[\\\/]/, '');
var img_filename_urlencoded = encodeURIComponent(img_filename)
item.src = item.src.replace(img_src, "../images/" + img_filename_urlencoded);
}
)
现在我们已经保存了可自主使用的页面。