EDIT
Старый код не мог засечь объект soup
из-за RecursionError
:
Traceback (most recent call last):
File "soup.py", line 20, in <module>
pickle.dump(soup, f)
RecursionError: maximum recursion depth exceeded while calling a Python object
Решение состоит в том, чтобы увеличить предел рекурсии .Они делают то же самое в этом ответе , который, в свою очередь, ссылается на документы .
HOWEVER , на конкретный сайт, на который вы пытаетесьзагрузка и сохранение чрезвычайно вложенные.Мой компьютер не может преодолеть рекурсию лимита в 50000, и этого недостаточно для вашего сайта и происходит сбой: 10008 segmentation fault (core dumped) python soup.py
.
Итак, если вам нужно скачать HTML и использовать его позже, вы можете сделать это:
from bs4 import BeautifulSoup
from urllib.request import urlopen
url = "https://coinmarketcap.com/all/views/all/"
html = urlopen(url)
# Save HTML to a file
with open("soup.html", "wb") as f:
while True:
chunk = html.read(1024)
if not chunk:
break
f.write(chunk)
Затем вы можете прочитать сохраненный вами HTML-файл и создать экземпляр объекта bs4:
# Read HTML from a file
with open("soup.html", "rb") as f:
soup = BeautifulSoup(f.read(), "lxml")
print(soup.title)
# <title>All Cryptocurrencies | CoinMarketCap</title>
Кроме того, этот код я бы использовал для менее вложенного сайта.:
import pickle
from bs4 import BeautifulSoup
from urllib.request import urlopen
import sys
url = "/12648659/kak-sohranit-obekt-beautifulsoup-v-fail-a-zatem-prochitat-ego-kak-beautifulsoup"
html = urlopen(url)
soup = BeautifulSoup(html,"lxml")
sys.setrecursionlimit(8000)
# Save the soup object to a file
with open("soup.pickle", "wb") as f:
pickle.dump(soup, f)
# Read the soup object from a file
with open("soup.pickle", "rb") as f:
soup_obj = pickle.load(f)
print(soup_obj.title)
# <title>python - How to save the BeautifulSoup object to a file and then read from it as BeautifulSoup? - Stack Overflow</title>.