Разделить HTML-документ по тегу — Python

Как лучше всего разделить HTML-документ/строку на основе наличия тега
? Я дал решение, которое у меня есть в настоящее время, ниже, но оно кажется довольно громоздким и, я думаю, его не так легко прочитать. Я также экспериментировал с регулярными выражениями, но мне сказали, что я не должен использовать регулярные выражения для анализа HTML.

for i, br in enumerate(soup.findAll('b')):
line_value = ''
line_values = []
next = br.next
while (next):
    if next and isinstance(next, Tag) and next.name == 'br':
        line_values.append(line_value)
        line_value = ''
    else:
        stripped_text = ''.join(BeautifulSoup(str(next).strip()).findAll(text=True))
        if stripped_text:
            line_value += stripped_text
    next = next.nextSibling
print line_values

Вот пример HTML, который я разбираю:

<p><font size="1" color="#800000"><b>09:00
  <font> - </font>
  11:00
  <br>
  CE4817
  <font> - </font>LAB <font>- </font>
  2A
  <br>
   B2043 B2042
  <br>

  Wks:1-13
  </b></font>
  </p>

И текущие результаты моего кода:

[u'09:00 - 11:00', u'CE4817 - LAB- 2A', u'B2043 B2042']
[u'11:00 - 12:00', u'CE4607 - TUT- 3A', u'A1054']

person stephenfin    schedule 24.09.2012    source источник
comment
Прошу уточнения: нужно ли разбивать html документ по тегу или просто удалить все теги из ввода?   -  person Gabber    schedule 25.09.2012
comment
Мне нужно разделить появление тега br (или другого указанного тега)   -  person stephenfin    schedule 25.09.2012


Ответы (2)


Попробуй это :

Регулярное выражение

<p><font size="1" color="#800000"><b>(\d{2}:\d{2}).*?(\d{2}:\d{2}).*?(\w{2}\d{4}).*?<font> - </font>(\w+)\s*<font>- </font>\s*(\d\w)\s*<br>\s*(\w\d{4}\s*\w\d{4})\s*<br>[\s\S]*?</p>

Режим

м - многострочный

Это будет работать до тех пор, пока структура html-кода не изменится.

person Stephan    schedule 24.09.2012

Разделить с помощью регулярных выражений

import re
p = re.compile(r'<br>')
filter(None, p.split(yourString))

Затем вы можете удалить другие теги html из каждой из возвращаемых строк в массиве.

Вы можете либо использовать существующую функцию, например Удалить html из строк в python, либо проверить мой ответ на вопрос Удаление тегов HTML без использования HtmlAgilityPack.

Проверьте также этот ответ: RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Вы должны действительно использовать парсер html для выполнения своей задачи.

person Gabber    schedule 24.09.2012