Витяг тексту з HTML-файлу за допомогою Python


243

Я хотів би витягнути текст з HTML-файлу за допомогою Python. Я хочу, по суті, такого ж результату, який я отримав, якби скопіював текст із браузера і вставив його в блокнот.

Мені б хотілося чогось більш надійного, ніж використання регулярних виразів, які можуть не працювати в погано сформованому HTML-коді. Я бачив, як багато людей рекомендують Beautiful Soup, але у мене виникли кілька проблем з його використанням. Для одного він підбирав небажаний текст, наприклад, джерело JavaScript. Крім того, він не інтерпретував сутності HTML. Наприклад, я б очікував & # 39; у джерелі HTML, який потрібно перетворити на апостроф у тексті, як би я вставив вміст веб-переглядача в блокнот.

Оновлення html2text виглядає багатообіцяючим. Він правильно обробляє HTML-сутності та ігнорує JavaScript. Однак він точно не дає простого тексту; він створює розмітку, яку потім доведеться перетворити на звичайний текст. Він не містить прикладів або документації, але код виглядає чистим.


Пов’язані запитання:


Довгий час люди, здається, вважають мою відповідь NLTK (зовсім недавньою) вкрай корисною, тому ви можете розглянути можливість зміни прийнятої відповіді. Дякую!
Шату

1
Я ніколи не думав, що натрапляю на запитання автора мого улюбленого блогу! Зусилля!
Райан Г

1
@Shatu Тепер, коли ваше рішення втратило чинність, ви можете видалити свій коментар. Дякую! ;)
Snađошƒаӽ

Відповіді:


136

html2text - програма Python, яка дуже добре справляється в цьому.


5
біт - це gpl 3.0, що означає, що це може бути несумісним
frog32

138
Дивовижний! її автор - RIP Аарон Суорц.
Атул Арвінд

2
Хтось знайшов альтернативи html2text через GPL 3.0?
jontsai

1
GPL не такий поганий, як люди хочуть. Аарон знав найкраще.
Стів К

2
Я спробував і html2text і nltk, але вони не працювали для мене. Я в кінцевому підсумку збирався з Beautiful Soup 4, який працює чудово (жоден каламбур не призначений).
Райан

150

Найкращий фрагмент коду, який я знайшов для вилучення тексту без отримання JavaScript або не потрібних речей:

import urllib
from bs4 import BeautifulSoup

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# kill all script and style elements
for script in soup(["script", "style"]):
    script.extract()    # rip it out

# get text
text = soup.get_text()

# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into a line each
chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
# drop blank lines
text = '\n'.join(chunk for chunk in chunks if chunk)

print(text)

Ви просто повинні встановити BeautifulSoup раніше:

pip install beautifulsoup4

2
Як, якщо ми хочемо вибрати якийсь рядок, щойно сказав, рядок №3?
hepidad

3
Сценарії вбивства кусаються, рятівник !!
Нанда

2
Переглянувши безліч відповідей на stackoverflow, я відчуваю, що це найкращий варіант для мене. Одна з проблем, з якою я зіткнулася, полягає в тому, що рядки додавалися разом у деяких випадках. Мені вдалося подолати це, додавши роздільник у функції get_text:text = soup.get_text(separator=' ')
Joswin KJ

5
Замість цього soup.get_text()я використовував soup.body.get_text(), щоб не отримати жодного тексту з <headелемента>, наприклад, заголовка.
Sjoerd

10
Для Python 3,from urllib.request import urlopen
Яків Калакал Йосиф

99

ПРИМІТКА: NTLK більше не підтримує clean_htmlфункцію

Оригінальна відповідь нижче та альтернатива в розділах коментарів.


Використовуйте NLTK

Я витратив свої 4-5 годин на вирішення проблем із html2text. На щастя, я міг зіткнутися з НЛТК.
Це працює магічно.

import nltk   
from urllib import urlopen

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"    
html = urlopen(url).read()    
raw = nltk.clean_html(html)  
print(raw)

8
іноді цього достатньо :)
Шарміла

8
Я хочу голосувати за це тисячу разів. Я застряг у пекельному регексі, але ось, тепер я бачу мудрість NLTK.
BenDundee

26
Мабуть, clean_html більше не підтримується: github.com/nltk/nltk/commit/…
alexanderlukanin13

5
імпорт важкої бібліотеки типу nltk для такого простого завдання було б занадто багато
richie

54
@ alexanderlukanin13 З джерела:raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Кріс Арена

54

Сьогодні я опинився перед такою самою проблемою. Я написав дуже простий парсер HTML, щоб зняти вхідний вміст усіх розміток, повернувши текст, що залишився, лише з мінімальним форматуванням.

from HTMLParser import HTMLParser
from re import sub
from sys import stderr
from traceback import print_exc

class _DeHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.__text = []

    def handle_data(self, data):
        text = data.strip()
        if len(text) > 0:
            text = sub('[ \t\r\n]+', ' ', text)
            self.__text.append(text + ' ')

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            self.__text.append('\n\n')
        elif tag == 'br':
            self.__text.append('\n')

    def handle_startendtag(self, tag, attrs):
        if tag == 'br':
            self.__text.append('\n\n')

    def text(self):
        return ''.join(self.__text).strip()


def dehtml(text):
    try:
        parser = _DeHTMLParser()
        parser.feed(text)
        parser.close()
        return parser.text()
    except:
        print_exc(file=stderr)
        return text


def main():
    text = r'''
        <html>
            <body>
                <b>Project:</b> DeHTML<br>
                <b>Description</b>:<br>
                This small script is intended to allow conversion from HTML markup to 
                plain text.
            </body>
        </html>
    '''
    print(dehtml(text))


if __name__ == '__main__':
    main()

5
Це здається найбільш простим способом зробити це в Python (2.7), використовуючи лише модулі за замовчуванням. Це справді нерозумно, оскільки це така загально потрібна річ, і немає жодної вагомої причини, чому для модуля HTMLParser за замовчуванням для цього немає аналізатора.
Ingmar Hupp

2
Я не думаю, що перетворять html-символи в unicode, правда? Наприклад, &amp;не буде перетворений &, правда?
швидкісний літак

Для використання Python 3from html.parser import HTMLParser
sebhaase

14

Ось версія відповіді xperroni, яка трохи повніша. Він пропускає розділи сценаріїв і стилів і перекладає шаррефи (наприклад, & # 39;) та HTML-елементи (наприклад, & amp;).

Він також включає тривіальний зворотний перетворювач з простого тексту в HTML.

"""
HTML <-> text conversions.
"""
from HTMLParser import HTMLParser, HTMLParseError
from htmlentitydefs import name2codepoint
import re

class _HTMLToText(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self._buf = []
        self.hide_output = False

    def handle_starttag(self, tag, attrs):
        if tag in ('p', 'br') and not self.hide_output:
            self._buf.append('\n')
        elif tag in ('script', 'style'):
            self.hide_output = True

    def handle_startendtag(self, tag, attrs):
        if tag == 'br':
            self._buf.append('\n')

    def handle_endtag(self, tag):
        if tag == 'p':
            self._buf.append('\n')
        elif tag in ('script', 'style'):
            self.hide_output = False

    def handle_data(self, text):
        if text and not self.hide_output:
            self._buf.append(re.sub(r'\s+', ' ', text))

    def handle_entityref(self, name):
        if name in name2codepoint and not self.hide_output:
            c = unichr(name2codepoint[name])
            self._buf.append(c)

    def handle_charref(self, name):
        if not self.hide_output:
            n = int(name[1:], 16) if name.startswith('x') else int(name)
            self._buf.append(unichr(n))

    def get_text(self):
        return re.sub(r' +', ' ', ''.join(self._buf))

def html_to_text(html):
    """
    Given a piece of HTML, return the plain text it contains.
    This handles entities and char refs, but not javascript and stylesheets.
    """
    parser = _HTMLToText()
    try:
        parser.feed(html)
        parser.close()
    except HTMLParseError:
        pass
    return parser.get_text()

def text_to_html(text):
    """
    Convert the given text to html, wrapping what looks like URLs with <a> tags,
    converting newlines to <br> tags and converting confusing chars into html
    entities.
    """
    def f(mo):
        t = mo.group()
        if len(t) == 1:
            return {'&':'&amp;', "'":'&#39;', '"':'&quot;', '<':'&lt;', '>':'&gt;'}.get(t)
        return '<a href="%s">%s</a>' % (t, t)
    return re.sub(r'https?://[^] ()"\';]+|[&\'"<>]', f, text)


У get_text '' .join має бути '' .join. Тут має бути порожнє місце, інакше частина текстів з’єднається.
Obinna Nnenanya

1
Крім того, це не охопить ВСІ тексти, за винятком того, що ви включаєте інші теги текстових контейнерів, такі як H1, H2 ...., span тощо. Мені довелося налаштувати його для кращого висвітлення.
Obinna Nnenanya

11

Я знаю, що відповідей уже багато, але найбільш елегантне та пітонічне рішення, яке я знайшов, описується частково тут .

from bs4 import BeautifulSoup

text = ''.join(BeautifulSoup(some_html_string, "html.parser").findAll(text=True))

Оновлення

На основі коментаря Фрейзера, ось більш елегантне рішення:

from bs4 import BeautifulSoup

clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings)

2
Щоб уникнути попередження, вкажіть аналізатор для використання BeautifulSoup:text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
Floyd

Ви можете використовувати генератор stripped_strings, щоб уникнути зайвого простору - тобтоclean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Фрейзер

8

Ви також можете використовувати метод html2text в бібліотеці стрипограм.

from stripogram import html2text
text = html2text(your_html_string)

Щоб встановити stripogram, запустіть sudo easy_install stripogram


23
Цей модуль, відповідно до його сторінки pypi , є застарілим: "Якщо у вас є якісь історичні причини для використання цього пакету, я б радив його"!
інтуїтивно

7

Існує бібліотека шаблонів для пошуку даних.

http://www.clips.ua.ac.be/pages/pattern-web

Ви навіть можете вирішити, які теги зберігати:

s = URL('http://www.clips.ua.ac.be').download()
s = plaintext(s, keep={'h1':[], 'h2':[], 'strong':[], 'a':['href']})
print s

6

PyParsing робить чудову роботу. Вікі PyParsing було вбито, тому тут є ще одне місце, де є приклади використання PyParsing ( приклад посилання ). Однією з причин інвестувати трохи часу на піпарсинг є те, що він також написав дуже короткий дуже добре організований посібник із короткого скорочення O'Reilly, який також є недорогим.

Сказавши це, я багато використовую BeautifulSoup, і не так вже й важко розібратися з проблемами сутностей, ви можете їх перетворити, перш ніж запустити BeautifulSoup.

Удачі


1
Посилання є мертвою або заваленою.
Іветт

4

Це не зовсім рішення Python, але воно перетворить текст, який Javascript створив би в текст, що я вважаю важливим (EG google.com). Посилання браузера (не Lynx) має механізм Javascript і перетворить джерело в текст за допомогою параметра -dump.

Отже, ви можете зробити щось на кшталт:

fname = os.tmpnam()
fname.write(html_source)
proc = subprocess.Popen(['links', '-dump', fname], 
                        stdout=subprocess.PIPE,
                        stderr=open('/dev/null','w'))
text = proc.stdout.read()

4

Замість модуля HTMLParser перевірте htmllib. Він має подібний інтерфейс, але робить більше за вас. (Це досить давньо, тому не дуже допомагає з точки зору позбавлення від javascript та css. Можна створити похідний клас, але додати методи з такими іменами, як start_script та end_style (деталі див. У документах python), але важко зробити це надійно для неправильно сформованого html.) У будь-якому випадку, ось щось просте, що друкує звичайний текст на консоль

from htmllib import HTMLParser, HTMLParseError
from formatter import AbstractFormatter, DumbWriter
p = HTMLParser(AbstractFormatter(DumbWriter()))
try: p.feed('hello<br>there'); p.close() #calling close is not usually needed, but let's play it safe
except HTMLParseError: print ':(' #the html is badly malformed (or you found a bug)

Примітка: HTMLError та HTMLParserError повинні читати HTMLParseError. Це працює, але робить погану роботу з підтриманням розривів лінії.
Дейв Лицар

4

Я рекомендую Пакет Python під назвою Гусак-екстрактор Goose намагатиметься отримати таку інформацію:

Основний текст статті Основне зображення статті Будь-які фільми Youtube / Vimeo, вкладені у статтю Meta Description Мета-теги

Детальніше: https://pypi.python.org/pypi/goose-extractor/


4

якщо вам потрібна більша швидкість і менша точність, ви можете використовувати сирий lxml.

import lxml.html as lh
from lxml.html.clean import clean_html

def lxml_to_text(html):
    doc = lh.fromstring(html)
    doc = clean_html(doc)
    return doc.text_content()

4

встановити html2text за допомогою

pip встановити html2text

тоді,

>>> import html2text
>>>
>>> h = html2text.HTML2Text()
>>> # Ignore converting links from HTML
>>> h.ignore_links = True
>>> print h.handle("<p>Hello, <a href='http://earth.google.com/'>world</a>!")
Hello, world!

4

Я знаю, що тут вже багато відповідей, але я думаю, що газета3k також заслуговує на згадку. Нещодавно мені потрібно було виконати подібне завдання - витягнути текст із статей в Інтернеті, і ця бібліотека виконала чудову роботу, досягнувши цього поки що в своїх тестах. Він ігнорує текст, знайдений у пунктах меню та бічних рядках, а також будь-який JavaScript, який відображається на сторінці в якості запиту ОП.

from newspaper import Article

article = Article(url)
article.download()
article.parse()
article.text

Якщо у вас вже завантажені HTML-файли, ви можете зробити щось подібне:

article = Article('')
article.set_html(html)
article.parse()
article.text

Він навіть має кілька функцій NLP для узагальнення тем статей:

article.nlp()
article.summary

3

Гарний суп дійсно конвертує html сутності. Це, мабуть, найкраща ставка, враховуючи, що HTML часто буває помилковим і наповнений проблемами кодування унікодом та html. Це код, який я використовую для перетворення html у вихідний текст:

import BeautifulSoup
def getsoup(data, to_unicode=False):
    data = data.replace("&nbsp;", " ")
    # Fixes for bad markup I've seen in the wild.  Remove if not applicable.
    masssage_bad_comments = [
        (re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1)),
        (re.compile('<!WWWAnswer T[=\w\d\s]*>'), lambda match: '<!--' + match.group(0) + '-->'),
    ]
    myNewMassage = copy.copy(BeautifulSoup.BeautifulSoup.MARKUP_MASSAGE)
    myNewMassage.extend(masssage_bad_comments)
    return BeautifulSoup.BeautifulSoup(data, markupMassage=myNewMassage,
        convertEntities=BeautifulSoup.BeautifulSoup.ALL_ENTITIES 
                    if to_unicode else None)

remove_html = lambda c: getsoup(c, to_unicode=True).getText(separator=u' ') if c else ""

3

Інший варіант - запустити HTML через текстовий веб-браузер і скинути його. Наприклад (за допомогою Lynx):

lynx -dump html_to_convert.html > converted_html.txt

Це можна зробити в сценарії python наступним чином:

import subprocess

with open('converted_html.txt', 'w') as outputFile:
    subprocess.call(['lynx', '-dump', 'html_to_convert.html'], stdout=testFile)

Він не дасть вам точно лише текст з HTML-файлу, але залежно від випадку використання він може бути кращим для виводу html2text.


3

Найкраще для мене працювали написи.

https://github.com/weblyzard/inscriptis

import urllib.request
from inscriptis import get_text

url = "http://www.informationscience.ch"
html = urllib.request.urlopen(url).read().decode('utf-8')

text = get_text(html)
print(text)

Результати справді хороші


2

Ще одне непітонське рішення: Libre Office:

soffice --headless --invisible --convert-to txt input1.html

Причиною, яку я віддаю перевагу саме цій, ніж інші альтернативи, є те, що кожен абзац HTML перетворюється в єдиний текстовий рядок (без розривів рядків), що саме я шукав. Інші методи вимагають післяобробки. Lynx дає хороший вихід, але не точно те, що я шукав. Крім того, Libre Office можна використовувати для конвертації з усіляких форматів ...


2

Хтось пробував bleach.clean(html,tags=[],strip=True)з хлоркою ? це працює для мене.


Здається, і для мене це працює, але вони не рекомендують використовувати його для цієї мети: "Ця функція - це функція, орієнтована на безпеку, єдиною метою якої є видалення шкідливого вмісту з рядка, щоб він міг відображатися як вміст в Інтернеті сторінки. " -> bleach.readthedocs.io/en/latest/clean.html#bleach.clean
Локтопус

2

У мене були хороші результати з Apache Tika . Його мета - вилучення метаданих та тексту із вмісту, отже, відповідний аналізатор відповідно налаштовується поза коробкою.

Tika можна запустити як сервер , тривіально для запуску / розгортання в контейнері Docker, а звідти можна отримати доступ через прив'язки Python .


1

по-простому

import re

html_text = open('html_file.html').read()
text_filtered = re.sub(r'<(.*?)>', '', html_text)

цей код знаходить усі частини html_text, що починаються з '<' і закінчуються на '>', і замінюють усі знайдені порожнім рядком


1

@ Відповідь PeYoTIL за допомогою BeautifulSoup та усунення стилю та вмісту сценарію для мене не працювало. Я спробував це decomposeзамість цього, extractале він все ще не працював. Тому я створив свій власний, який також форматує текст за допомогою <p>тегів і замінює <a>теги посиланням href. Також справляється із посиланнями всередині тексту. Доступний у цій суті із вбудованим тестовим документом.

from bs4 import BeautifulSoup, NavigableString

def html_to_text(html):
    "Creates a formatted text email message as a string from a rendered html template (page)"
    soup = BeautifulSoup(html, 'html.parser')
    # Ignore anything in head
    body, text = soup.body, []
    for element in body.descendants:
        # We use type and not isinstance since comments, cdata, etc are subclasses that we don't want
        if type(element) == NavigableString:
            # We use the assumption that other tags can't be inside a script or style
            if element.parent.name in ('script', 'style'):
                continue

            # remove any multiple and leading/trailing whitespace
            string = ' '.join(element.string.split())
            if string:
                if element.parent.name == 'a':
                    a_tag = element.parent
                    # replace link text with the link
                    string = a_tag['href']
                    # concatenate with any non-empty immediately previous string
                    if (    type(a_tag.previous_sibling) == NavigableString and
                            a_tag.previous_sibling.string.strip() ):
                        text[-1] = text[-1] + ' ' + string
                        continue
                elif element.previous_sibling and element.previous_sibling.name == 'a':
                    text[-1] = text[-1] + ' ' + string
                    continue
                elif element.parent.name == 'p':
                    # Add extra paragraph formatting newline
                    string = '\n' + string
                text += [string]
    doc = '\n'.join(text)
    return doc

1
Дякую, ця відповідь занижена. Для тих із нас, хто хоче мати чітке подання тексту, яке більше схоже на браузер (ігноруючи нові рядки та беручи до уваги лише абзаци та рядки рядків), BeautifulSoup get_textпросто не скорочує його.
1818 року

@jrial рада, що ви вважаєте це корисним, також дякую за внесок. Для будь-кого іншого, суть пов'язаних суттєво була вдосконалена. Здається, що ОП натякає на це інструмент, який надає HTML в текст, подібно до текстового браузера, як рись. Ось що намагається це рішення. Що робить більшість людей - це лише текстові витяжки.
racitup

1

У Python 3.x ви можете зробити це дуже просто, імпортуючи пакети 'imaplib' та 'email'. Хоча це старіший пост, але, можливо, моя відповідь може допомогти новим бажаючим у цій публікації.

status, data = self.imap.fetch(num, '(RFC822)')
email_msg = email.message_from_bytes(data[0][1]) 
#email.message_from_string(data[0][1])

#If message is multi part we only want the text version of the body, this walks the message and gets the body.

if email_msg.is_multipart():
    for part in email_msg.walk():       
        if part.get_content_type() == "text/plain":
            body = part.get_payload(decode=True) #to control automatic email-style MIME decoding (e.g., Base64, uuencode, quoted-printable)
            body = body.decode()
        elif part.get_content_type() == "text/html":
            continue

Тепер ви можете надрукувати змінну тіла, і вона буде у форматі простого тексту :) Якщо вона достатньо хороша для вас, тоді було б непогано вибрати її як прийняту відповідь.


Це нічого не конвертує .
Антті Хаапала

1
Це показує, як витягти text/plainчастину з електронного листа, якщо хтось інший поставив її туди. Це не робить нічого для перетворення HTML у звичайний текст і не робить нічого віддаленого, якщо ви намагаєтеся перетворити HTML з, скажімо, веб-сайту.
трійка

1

ви можете витягти лише текст з HTML за допомогою BeautifulSoup

url = "https://www.geeksforgeeks.org/extracting-email-addresses-using-regular-expressions-python/"
con = urlopen(url).read()
soup = BeautifulSoup(con,'html.parser')
texts = soup.get_text()
print(texts)

1

Незважаючи на те, що багато людей, які згадують, що використовували регулярний гекс для теги HTML-тегів, є багато недоліків.

наприклад:

<p>hello&nbsp;world</p>I love you

Слід розбирати на:

Hello world
I love you

Ось фрагмент, який я придумав, ви можете налаштувати його під ваші конкретні потреби, і він працює як шарм

import re
import html
def html2text(htm):
    ret = html.unescape(htm)
    ret = ret.translate({
        8209: ord('-'),
        8220: ord('"'),
        8221: ord('"'),
        160: ord(' '),
    })
    ret = re.sub(r"\s", " ", ret, flags = re.MULTILINE)
    ret = re.sub("<br>|<br />|</p>|</div>|</h\d>", "\n", ret, flags = re.IGNORECASE)
    ret = re.sub('<.*?>', ' ', ret, flags=re.DOTALL)
    ret = re.sub(r"  +", " ", ret)
    return ret

1

Ще один приклад використання BeautifulSoup4 в Python 2.7.9+

включає:

import urllib2
from bs4 import BeautifulSoup

Код:

def read_website_to_text(url):
    page = urllib2.urlopen(url)
    soup = BeautifulSoup(page, 'html.parser')
    for script in soup(["script", "style"]):
        script.extract() 
    text = soup.get_text()
    lines = (line.strip() for line in text.splitlines())
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    text = '\n'.join(chunk for chunk in chunks if chunk)
    return str(text.encode('utf-8'))

Пояснили:

Прочитайте дані url як html (за допомогою BeautifulSoup), видаліть усі елементи сценарію та стилю, а також отримайте лише текст, використовуючи .get_text (). Розбийте на рядки та видаліть провідні та кінцеві пробіли на кожному, а потім розбийте багатозагальні заголовки на рядки кожен фрагмент = (фраза.strip () для рядка в рядках для фрази у line.split ("")). Потім, використовуючи text = '\ n'.join, відкиньте порожні рядки та нарешті поверніться як санкціоновані utf-8.

Примітки:

  • Деякі системи, на яких запущено, не вдасться при з'єднаннях https: // через проблему SSL, ви можете вимкнути перевірку, щоб виправити цю проблему. Приклад виправлення: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/

  • У Python <2.7.9 може виникнути певна проблема

  • text.encode ('utf-8') може залишити дивне кодування, може просто захотіти повернути str (текст).


0

Ось код, яким я користуюсь регулярно.

from bs4 import BeautifulSoup
import urllib.request


def processText(webpage):

    # EMPTY LIST TO STORE PROCESSED TEXT
    proc_text = []

    try:
        news_open = urllib.request.urlopen(webpage.group())
        news_soup = BeautifulSoup(news_open, "lxml")
        news_para = news_soup.find_all("p", text = True)

        for item in news_para:
            # SPLIT WORDS, JOIN WORDS TO REMOVE EXTRA SPACES
            para_text = (' ').join((item.text).split())

            # COMBINE LINES/PARAGRAPHS INTO A LIST
            proc_text.append(para_text)

    except urllib.error.HTTPError:
        pass

    return proc_text

Я сподіваюся, що це допомагає.


0

Коментар письменника LibreOffice є заслугою, оскільки програма може використовувати макроси python. Здається, вона пропонує багато переваг як для відповіді на це питання, так і для подальшого розширення макроснови LibreOffice. Якщо ця резолюція є разовою реалізацією, а не використовуватися як частина більшої виробничої програми, відкриття HTML у програмі і збереження сторінки як тексту, здавалося б, вирішить обговорені тут проблеми.


0

Перл спосіб (вибачте мама, я ніколи цього не робитиму на виробництві).

import re

def html2text(html):
    res = re.sub('<.*?>', ' ', html, flags=re.DOTALL | re.MULTILINE)
    res = re.sub('\n+', '\n', res)
    res = re.sub('\r+', '', res)
    res = re.sub('[\t ]+', ' ', res)
    res = re.sub('\t+', '\t', res)
    res = re.sub('(\n )+', '\n ', res)
    return res

Це погана практика з багатьох причин, наприклад&nbsp;
Урі Горен

Так! Це правда! Не роби це нікуди!
brunql
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.