2014-10-24 3 views
0

У меня есть строка, как это:Как удалить теги HTML из строк python?

<h2 class="debateHeaderProp">This house believes that society benefits when we share personal information online.</h2> 

, что это лучший способ, чтобы удалить что-нибудь между «<» и «>» и только левыми «Этот дом считает, что общество выигрывает, когда мы раскрываем личную информацию в Интернете»?

+0

«Лучшее» зависит от того, что вы хотите - если вы хотите * надежного *, вы будете использовать настоящий парсер HTML. Если вы хотите «коротко писать, нет зависимостей и нормально, если иногда он ошибочно выводит« ... ну, это действительно «лучше»? –

+0

Что делать, если ваша строка содержит объекты HTML, такие как '&', '>', '<' и т. Д. - вам нужны те, которые нужно удалить (или, скорее, заменить на '&', '>', '<', и т. д.) тоже? Если это так, вы выходите из территории регулярного выражения и в реальную парсерную территорию. К счастью, для Python есть несколько отличных парсеров HTML. –

+0

Quick & dirty: Заменить '<.*?>' пустой строкой, но [meh] (http://stackoverflow.com/a/1732454/3764814) –

ответ

0

С одной только линии разметки, используя специальный анализатор является своего рода излишеством. Однако для больших наборов данных использование парсера, такого как BeautifulSoup, - путь. См. Пример ниже.

from bs4 import BeautifulSoup as bsoup 
import re 

markup = """ 
<h2 class="debateHeaderProp">This house believes that society benefits when we share personal information online.</h2> 
<span class="debateFormat">Oregon-Oxford, Cross Examination</span> 
<div class="debateAffirmSide">On the affirmative: Foo Debate Club</div> 
<div class="debateOpposeSide">On the opposition: Bar Debate Club</div> 
""" 
soup = bsoup(markup) 

# Explicitly define the tag and class. 
motion = soup.find("h2", class_="debateHeaderProp").get_text() 
# Or just use the class. 
d_format = soup.find(class_="debateFormat").get_text() 
# And even use regex for more power. 
teams = [t.get_text() for t in soup.find_all("div", class_=re.compile(r".*debate.*Side.*"))] 

print "Our Debate for Today" 
print "Motion:", motion 
print "Format:", d_format 
print teams[0] 
print teams[1] 

# Prints the following: 
# Our Debate for Today 
# Motion: This house believes that society benefits when we share personal information online. 
# Format: Oregon-Oxford, Cross Examination 
# On the affirmative: Foo Debate Club 
# On the opposition: Bar Debate Club 

Еще один вариант с использованием XML-парсер, похожий на lxml.

0

Вот способ (не уверен, что это «лучший»)

>>> from xml.etree.ElementTree import XML 
>>> s = '<h2 class="debateHeaderProp">This house believes that society benefits when we share personal information online.</h2>' 
>>> x = XML(s) 
>>> x.text 
'This house believes that society benefits when we share personal information online.' 
>>> 
0

XML является по своей сути иерархический формат данных, и наиболее естественный способ представить это с деревом. Для этой цели ET имеет два класса: ElementTree представляет весь XML-документ как дерево, а Element представляет собой единственный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в/из файлов) обычно выполняется на уровне ElementTree. Взаимодействие с одним элементом XML и его подэлементами выполняется на уровне элемента.

далее в parsing XML

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

>>> import re 
>>> re.search(r'(?<=>).*(?=<)' ,s).group(0) 
'This house believes that society benefits when we share personal information online.' 
Смежные вопросы