Странная ошибка в Python при использовании метода BeautifulSoup Prettify - PullRequest
0 голосов
/ 16 июня 2020

У меня возникла следующая проблема. Я написал простой «TextBasedBrowser» (если вы даже можете называть его браузером: D). Парсинг и парсинг веб-сайтов с помощью BS4 пока работает отлично, но он отформатирован как дерьмо и практически нечитаем. Как только я пытаюсь использовать метод prettify () из BS4, он выдает мне AttributeError. Я довольно долго искал в Google, но ничего не нашел. Это мой код (метод prettify () там прокомментирован):

from bs4 import BeautifulSoup
import requests
import sys
import os

legal_html_tags = ['p', 'a', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'title']
saved_pages = []


def search_url(url):
    saved_pages.append(url.rstrip(".com"))
    url = requests.get(f'https://{url}')
    return url.text


def parse_html(html_page):
    final_text = ""
    soup = BeautifulSoup(html_page, 'html.parser')
    # soup = soup.prettify()
    plain_text = soup.find_all(text=True)
    for t in plain_text:
        if t.parent.name in legal_html_tags:
            final_text += '{} '.format(t)
    return final_text


def save_webpage(url, tb_dir):
    with open(f'{tb_dir}/{url.rstrip(".com")}.txt', 'w', encoding="utf-8") as tab:
        tab.write(parse_html(search_url(url)))


def check_url(url):
    if url.endswith(".com") or url.endswith(".org") or url.endswith(".net"):
        return True
    else:
        return False


args = sys.argv
directory = args[1]
try:
    os.mkdir(directory)
except FileExistsError:
    print("Error: File already exists")

while True:
    url_ = input()
    if url_ == "exit":
        break
    elif url_ in saved_pages:
        with open(f'{directory}/{url_}.txt', 'r', encoding="utf-8") as curr_page:
            print(curr_page.read())
    elif not check_url(url_):
        print("Error: Invalid URL")
    else:
        save_webpage(url_, directory)
        print(parse_html(search_url(url_)))

И это ошибка:

Traceback (most recent call last):
  File "browser.py", line 56, in <module>
    save_webpage(url_, directory)
  File "browser.py", line 29, in save_webpage
    tab.write(parse_html(search_url(url)))
  File "browser.py", line 20, in parse_html
    plain_text = soup.find_all(text=True)
AttributeError: 'str' object has no attribute 'find_all'

Если я включу параметр кодировки в prettify () метод, он выдает мне байты вместо объекта str.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Вы переназначили переменную soup в строку с помощью метода .prettify ()

soup = soup.prettify()

find_all () - метод только для объектов soup

Вы должны вызвать find_all (text = True) и извлеките все теги html с текстом, затем выполните строковые операции.

0 голосов
/ 16 июня 2020

prettify превращает ваш проанализированный HTML объект в строку, поэтому вы не можете вызвать find_all на нем. Может быть, вы просто хотите return soup.prettify()? Это может быть то, что вы хотите:

def parse_html(html_page):
    final_text = ""
    soup = BeautifulSoup(html_page, 'html.parser')
    plain_text = soup.find_all(text=True)
    for t in plain_text:
        if t.parent.name in legal_html_tags:
            final_text += t.prettify() + " "
    return final_text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...