Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: stephenfinОтветов: 2

Как лучше всего разделить 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']
  • Прошу уточнения: нужно ли разбивать html документ по тегу или просто удалить все теги из ввода? Gabber 25.09.2012
  • Мне нужно разделить появление тега br (или другого указанного тега) stephenfin 25.09.2012

pythonhtmlparsingbeautifulsoupregex

Ответы

Ответ 1 · Stephan

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

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

<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-кода не изменится.

Ответ 2 · Gabber

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы