Я постараюсь держать это коротко и точно.
Учитывая следующее
#!/usr/bin/python
from lxml import etree
root = etree.Element('root')
sect = etree.SubElement(root,'sect')
para = etree.SubElement(sect,'para')
para.text = 'this is a [b]long[/b] block of text. Much longer than this example makes it out to be.'
как мне лучше всего преобразовать вывод в то, что у меня ниже? обратите внимание, что [b] стало элементом <b>
<root>
<sect>
<para>
this is a <b>long</b> block of text.
Much longer than this example makes it out to be.
</para>
</sect>
</root>
Мой реальный ввод и xml значительно сложнее. Тем не менее, это суть этого. Я взял стандартно отформатированный текстовый документ и конвертирую его в xml. Структура документа довольно статична. Поэтому это не так безумно, как кажется. В настоящее время я разбил его на строки. Это актуально, потому что, проходя каждую строку, у меня нет проблем с идентификацией <sect>
или <title>
, но часто <para>
будет иметь дополнительное форматирование в своей строке. В этом примере, [b]
, который должен быть преобразован еще раз. Как лучше всего это сделать?
Что нужно иметь в виду
авторы моих входных текстов не всегда последовательны. следовательно, было бы лучше разработать потерянное регулярное выражение, чтобы найти [b] WORD [/ b] или когда авторы ошибаются чем-то вроде [b [WORD [/ b]. моя текущая идея состоит в том, чтобы соответствовать что-то вроде [b или b]
В настоящее время я обрабатываю свой входной файл построчно. Я удалил все пустые строки. я должен рассмотреть обработку этого позже? У меня нет сильной цели, но я чувствую, что это может быть заключено в один цикл текста.
Это должно хорошо работать с lxml при выводе документа. например, см. редактирование ниже с моим комментарием к парсеру bbc
Я работал над этим большую часть дня и могу обсудить больше маршрутов, которые я выбрал. Я буду работать над этим в течение всего вечера, поэтому, если я буду сталкиваться с другими вещами, чтобы иметь в виду, я обновлю этот вопрос соответственно.
РЕДАКТИРОВАТЬ: Или моя проблема с парсером BBC
Пол задумчиво предложил postmarkup-1.1.4 , однако, как вы можете заметить, он плохо работает с lxml. преобразование элементов в сущности. Это была проблема, с которой я столкнулся сегодня днем, когда сделал это через поиск и замену. В конечном счете, это идеальное решение для sed. Как было указано. Однако я надеялся, что не стану конечным пользователем этого скрипта, и предпочел бы все, что содержится в одной команде.
>>> p.text = render_bbcode(p.text)
>>> p.text
'this is a <strong>long</strong> text string'
>>> etree.tostring(root)
'<root><p>this is a <strong>long</strong> text string</p></root>'
если сделать это в обратном порядке, результат будет одинаково плохим
>>> p.text
'this is a [b]long[/b] text string
>>> render_bbcode(etree.tostring(root))
u'<root><p>this is a <strong>long</strong> string</p></root>'