Удаление тегов HTML из текста с помощью Регулярного выражения в Python

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

import urllib.request, re
def test(url):
html = str(urllib.request.urlopen(url).read())
print(re.findall('<[\w\/\.\w]*>',html))

HTML является простой страницей с несколькими ссылками и текстом, но мой regex не возьмет! DOCTYPE ОБЩЕСТВЕННОСТЬ HTML "-//W3C//DTD HTML 4.01, Переходный//EN" и 'href = "....", отмечает. Кто-либо может объяснить, что я должен изменить в своем regex?

6
задан Dan 29 January 2010 в 23:22
поделиться

2 ответа

Использование Beautifulsoup . Используйте LXML . Не используйте регулярные выражения , чтобы разбирать HTML.


Отредактируйте 2010-01-29: Это будет разумная отправная точка для LXML:

from lxml.html import fromstring
from lxml.html.clean import Cleaner
import requests

url = "https://stackoverflow.com/questions/2165943/removing-html-tags-from-a-text-using-regular-expression-in-python"
html = requests.get(url).text

doc = fromstring(html)

tags = ['h1','h2','h3','h4','h5','h6',
       'div', 'span', 
       'img', 'area', 'map']
args = {'meta':False, 'safe_attrs_only':False, 'page_structure':False, 
       'scripts':True, 'style':True, 'links':True, 'remove_tags':tags}
cleaner = Cleaner(**args)

path = '/html/body'
body = doc.xpath(path)[0]

print cleaner.clean_html(body).text_content().encode('ascii', 'ignore')

Вы хотите, чтобы содержимое, поэтому, по-видимому, вы не хотите никакого JavaScript или CSS. Также, по-видимому, вы хотите только содержание в теле, а не HTML от головы тоже. Читайте на LXML.html.Clean , чтобы увидеть, что вы можете легко распределить. Способ умнее, чем регулярные выражения, нет?

также, следите за проблемами кодирования Unicode. Вы можете легко в конечном итоге с HTML, который вы не можете печатать.


2012-11-08: изменено с использованием запросов URLLIB2 на . Просто используйте запросы!

14
ответ дан 8 December 2019 в 18:36
поделиться
import re
patjunk = re.compile("<.*?>|&nbsp;|&amp;",re.DOTALL|re.M)
url="http://www.yahoo.com"
def test(url,pat):
    html = urllib2.urlopen(url).read()
    return pat.sub("",html)

print test(url,patjunk)
-1
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

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