在给定URL的情况下,Python是否有下载整个HTML
页面及其内容(如图片、CSS)到本地文件夹的方法?并更新本地HTML文件以从本地获取内容。
urllib
模块下载单个URL,但这只会返回数据。它不会解析HTML并自动下载像CSS文件和图像这样的东西。你可以使用urllib:
import urllib.request
opener = urllib.request.FancyURLopener({})
url = "http://stackoverflow.com/"
f = opener.open(url)
content = f.read()
FancyURLopener调用请求的方式已过时。请使用更新的urlopen函数/方法
- rien333savePage
函数的功能:tags_inner
字典的键,保存 .html
以及下载的 javascripts
、css
和 images
,这些资源文件都基于 script、link 和 img 标签。_files
的文件夹中。sys.stderr
中。该函数使用 Python 3+ 中的 Requests、BeautifulSoup 和其他标准库。
函数savePage
接收一个url
和pagepath
作为参数,用来指定页面的保存位置。
import os, sys, re
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
def savePage(url, pagepath='page'):
def savenRename(soup, pagefolder, session, url, tag, inner):
if not os.path.exists(pagefolder): # create only once
os.mkdir(pagefolder)
for res in soup.findAll(tag): # images, css, etc..
if res.has_attr(inner): # check inner tag (file object) MUST exists
try:
filename, ext = os.path.splitext(os.path.basename(res[inner])) # get name and extension
filename = re.sub('\W+', '', filename) + ext # clean special chars from name
fileurl = urljoin(url, res.get(inner))
filepath = os.path.join(pagefolder, filename)
# rename html ref so can move html and folder of files anywhere
res[inner] = os.path.join(os.path.basename(pagefolder), filename)
if not os.path.isfile(filepath): # was not downloaded
with open(filepath, 'wb') as file:
filebin = session.get(fileurl)
file.write(filebin.content)
except Exception as exc:
print(exc, file=sys.stderr)
session = requests.Session()
#... whatever other requests config you need here
response = session.get(url)
soup = BeautifulSoup(response.text, "html.parser")
path, _ = os.path.splitext(pagepath)
pagefolder = path+'_files' # page contents folder
tags_inner = {'img': 'src', 'link': 'href', 'script': 'src'} # tag&inner tags to grab
for tag, inner in tags_inner.items(): # saves resource files and rename refs
savenRename(soup, pagefolder, session, url, tag, inner)
with open(path+'.html', 'wb') as file: # saves modified html doc
file.write(soup.prettify('utf-8'))
示例:将google.com
保存为google.html
,并将google_files
文件夹中的内容保存在当前文件夹中。
savePage('https://www.google.com', 'google')
soup = BeautifulSoup(response.text, "html.parser")
中的“lxml”改为了“html.parser”。 - imbr