С одной только линии разметки, используя специальный анализатор является своего рода излишеством. Однако для больших наборов данных использование парсера, такого как 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
.
«Лучшее» зависит от того, что вы хотите - если вы хотите * надежного *, вы будете использовать настоящий парсер HTML. Если вы хотите «коротко писать, нет зависимостей и нормально, если иногда он ошибочно выводит« ... ну, это действительно «лучше»? –
Что делать, если ваша строка содержит объекты HTML, такие как '&', '>', '<' и т. Д. - вам нужны те, которые нужно удалить (или, скорее, заменить на '&', '>', '<', и т. д.) тоже? Если это так, вы выходите из территории регулярного выражения и в реальную парсерную территорию. К счастью, для Python есть несколько отличных парсеров HTML. –
Quick & dirty: Заменить '<.*?>' пустой строкой, но [meh] (http://stackoverflow.com/a/1732454/3764814) –