Вопрос по python, beautifulsoup – Отрисовал HTML в простой текст, используя Python

32

Я пытаюсь конвертировать кусок HTML-текста с BeautifulSoup. Вот пример:


    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    
        list item
        yet another list item
    

<p>Some other text</p>

    list item
    yet another list item

Я пытался сделать что-то вроде:

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)

... но так мой элемент span всегда находится на новой строке. Это, конечно, простой пример. Есть ли способ получить текст на странице HTML так, как он будет отображаться в браузере (правила CSS не требуются, просто отображаются элементы div, span, li и т. Д.) В Python?

Покажите нам, как выглядит ожидаемый результат? Вы хотите убрать все отступы и пробелы, верно? smci

Ваш Ответ

2   ответа
4

Я столкнулся с той же проблемой, пытаясь разобрать визуализированный HTML. В основном кажется, что BS не идеальный пакет для этого. @Del дает отличное решение html2text.

По другому вопросу:BeautifulSoup get_text не удаляет все теги и JavaScript @Helge упоминается с помощью nltk. К сожалению, nltk, похоже, прекращает этот метод.

Я попробовал и html2text, и nltk.clean_html, и был удивлен результатами синхронизации, поэтому подумал, что они гарантируют ответ для потомков. Конечно, скорость сильно зависит от содержимого данных ...

Ответ от @Helge (nltk).

import nltk

%timeit nltk.clean_html(html)
was returning 153 us per loop

Он работал очень хорошо, чтобы вернуть строку с визуализированным HTML. Этот модуль nltk был быстрее, чем даже html2text, хотя, возможно, html2text более устойчив.

Ответ выше от @del

betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
nltk.clean_html даетNotImplementedError: To remove HTML markup, use BeautifulSoup's get_text() function Martin Thoma
Даже если у вас есть старая версия nltk, нет использовать эту функцию. Это'быстро, потому что он обрабатывает HTML с регулярными выражениями:github.com/nltk/nltk/blob/... digenishjkl
Я добавил ответ на связанный вопрос, который дает возможность убрать JavaScript с помощью BeautifulSoup:stackoverflow.com/a/47782943/2112722 Sarah Messer
73

BeautifulSoup - это очищающая библиотека, так чтоВозможно, это не лучший выбор для рендеринга HTML. Если оно'Не обязательно использовать BeautifulSoup, вы должны взглянуть наhtml2text, Например:

import html2text
html = open("foobar.html").read()
print html2text.html2text(html)

Это выводит:

Some text more text even more text

  * list item
  * yet another list item

Some other text

  * list item
  * yet another list item
Этот ответ сделал меня счастливым и грустным одновременно. RIP Аарон Шварц. Steve Rossiter
Могу ли я использовать html2text в сочетании с BeautifulSoup. Например, я анализирую кусок HTML яменя интересует, а затем передать его в html2text с помощью pretify ()? btatarov
Да, html2text может обрабатывать HTML порциями, вызываяHTML2Text.feed(chunk) на каждом последующем куске, а затем вызываяHTML2Text.close() чтобы получить текстовый результат (аналогичноHTMLParser.feed()). del

Похожие вопросы