Удаление Python HTML - PullRequest
       9

Удаление Python HTML

6 голосов
/ 01 марта 2009

Как я могу удалить весь HTML из строки в Python? Например, как я могу включить:

blah blah <a href="blah">link</a>

в

blah blah link

Спасибо!

Ответы [ 9 ]

18 голосов
/ 01 марта 2009

Когда ваше решение для регулярных выражений попадает в стену, попробуйте эту супер-легкую (и надежную) программу BeautifulSoup .

from BeautifulSoup import BeautifulSoup

html = "<a> Keep me </a>"
soup = BeautifulSoup(html)

text_parts = soup.findAll(text=True)
text = ''.join(text_parts)
10 голосов
/ 01 марта 2009

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

Вы можете использовать его так:

from stripogram import html2text, html2safehtml
# Only allow <b>, <a>, <i>, <br>, and <p> tags
clean_html = html2safehtml(original_html,valid_tags=("b", "a", "i", "br", "p"))
# Don't process <img> tags, just strip them out. Use an indent of 4 spaces 
# and a page that's 80 characters wide.
text = html2text(original_html,ignore_tags=("img",),indent_width=4,page_width=80)

Поэтому, если вы хотите просто удалить весь HTML, вы передаете valid_tags = () первой функции.

Документацию можно найти здесь .

7 голосов
/ 01 марта 2009

Вы можете использовать регулярное выражение для удаления всех тегов:

>>> import re
>>> s = 'blah blah <a href="blah">link</a>'
>>> re.sub('<[^>]*>', '', s)
'blah blah link'
5 голосов
/ 01 марта 2009

Regexs, BeautifulSoup, html2text не работают , если атрибут содержит '>' . См. Допускается ли «>» (U + 003E GREATER-THAN SIGN) внутри значения атрибута html-элемента?

Решение на основе HTML / XML-парсера может помочь в таких случаях, например, stripogram , предложенный @ MrTopf , работает.

Вот решение на основе ElementTree :

####from xml.etree import ElementTree as etree # stdlib
from lxml import etree

str_ = 'blah blah <a href="blah">link</a> END'
root = etree.fromstring('<html>%s</html>' % str_)
print ''.join(root.itertext()) # lxml or ElementTree 1.3+

Выход:

blah blah link END
3 голосов
/ 01 марта 2009

Попробуйте Красивый суп . Выбросьте все, кроме текста.

2 голосов
/ 01 марта 2009

html2text сделает что-то подобное.

1 голос
/ 22 января 2013

Есть простой способ:

def remove_html_markup(s):
    tag = False
    quote = False
    out = ""

    for c in s:
            if c == '<' and not quote:
                tag = True
            elif c == '>' and not quote:
                tag = False
            elif (c == '"' or c == "'") and tag:
                quote = not quote
            elif not tag:
                out = out + c

    return out

Идея объясняется здесь: http://youtu.be/2tu9LTDujbw

Вы можете увидеть это здесь: http://youtu.be/HPkNPcYed9M?t=35s

PS - Если вы заинтересованы в классе (об умной отладке с python), я дам вам ссылку: http://www.udacity.com/overview/Course/cs259/CourseRev/1. Это бесплатно!

Добро пожаловать! :)

1 голос
/ 29 июня 2012

Я только что написал это. Мне это надо. Он использует html2text и принимает путь к файлу, хотя я бы предпочел URL. Выходные данные html2text хранятся в TextFromHtml2Text.text распечатайте его, храните, кормите своим питомцем.

import html2text
class TextFromHtml2Text:

    def __init__(self, url = ''):
        if url == '':
            raise TypeError("Needs a URL")
        self.text = ""
        self.url = url
        self.html = ""
        self.gethtmlfile()
        self.maytheswartzbewithyou()

    def gethtmlfile(self):
        file = open(self.url)
        for line in file.readlines():
            self.html += line

    def maytheswartzbewithyou(self):
        self.text = html2text.html2text(self.html)
0 голосов
/ 01 марта 2009
>>> import re
>>> s = 'blah blah <a href="blah">link</a>'
>>> q = re.compile(r'<.*?>', re.IGNORECASE)
>>> re.sub(q, '', s)
'blah blah link'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...