2013-09-01 2 views
0

в HTML-файл, я получил следующие вхождения:Handle HTML-теги с помощью питона

<span class="finereader"></span> 

или

<span class="finereader">a</span> 

Я хотел бы, чтобы удалить все эти теги. Второй пример показывает, что возможно, что в теге есть буква (или номер, но только 1). Письмо не следует удалять, только <span class="finereader"> и следующие </span>. Есть ли какое-либо re.sub-выражение, которое может это сделать? Спасибо за любую помощь.

ответ

3

Другое решение с использованием BeautifulSoup:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(open('htmlfile')) 

for elem in soup.find_all('span', class_='finereader'): 
    elem.replace_with(elem.string or '') 

print(soup.prettify()) 
+0

Возможно ли использование строк или LXML? Поскольку я работал с lxml ... и если я правильно понял, BS - это просто альтернатива lxml, не так ли? – MarkF6

+0

@ MarkF6: 'BeautifulSoup' может использовать несколько парсеров, один из которых' lxml'. Взгляните на http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser – Birei

+0

Большое спасибо. Это сработало. Но у меня есть последняя проблема: макет, который создает BS (со всеми изменениями), мне не помогает; на самом деле, я бы вообще не хотел менять. Есть ли возможность достичь этого с помощью BS? – MarkF6

1

Возможно, вы захотите посмотреть на beautifulsoup вместо использования регулярных выражений для этой задачи.

Затем вы можете сделать что-то вроде этого: (используется строка в этом примере в качестве HTML-файла)

from bs4 import BeautifulSoup 

html_doc = """ 
<html> 
<head> 
<title>Sample</title> 
</head> 
<body> 
<span class="dummy">a</span> 
<span>b</span> 
</body> 
</html> 
""" 
soup = BeautifulSoup(html_doc) 
for span in soup.find_all('span'): 
    print(span.string) 

# output: 
# a 
# b