Как сохранить объект BeautifulSoup в файл, а затем прочитать его как BeautifulSoup? - PullRequest
0 голосов
/ 24 октября 2018

Я хочу сохранить объект BeautifulSoup в файл.Итак, я превращаю его в строку, а затем записываю в файл.Затем, прочитав его как строку, я преобразую строку в объект BeautifulSoup.Это помогло бы во время моего тестирования, поскольку данные, которые я собираю, являются динамическими.

url = "https://coinmarketcap.com/all/views/all/"
html = urlopen(url)
soup = BeautifulSoup(html,"lxml")

Запись объекта супа следующим образом:

  new_soup = str(soup)
  with open("coin.txt", "w+") as f:
      f.write(new_soup)

приводит к этой ошибке:

UnicodeEncodeError: 'charmap' codec can't encode 
characters in position 28127-28132: character maps to <undefined>

Кроме того, если я смогу сохранить его в файл, как бы я прочитал строку, возвращенную как объект BeautifulSoup?

1 Ответ

0 голосов
/ 24 октября 2018

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>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...