Prettify XML, произведенный Beautifulsoup с помощью регулярных выражений - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь получить действительный печатный XML, чтобы передать его дальше requests

Тем не менее, XML «prettifyed» BeautifulSoup выглядит следующим образом:

...
 <typ>
  TYPE_1
 </typ>
 <rte>
  AL38941XXXXX
 </rte>
 <sts>
  ADDED
 </sts>
...

Удобный способ справиться с таким беспорядочным выводом, описанным здесь

text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)    
prettyXml = text_re.sub('>\g<1></', uglyXml)

, что дает:

 <typ>TYPE_1</typ>
 <rte>AL38941XXXXX</rte>
 <sts>ADDED</sts>

Однако, когда дело доходит до пустых значений, регулярное выражение просто пропускает их, что приводит к проблемам, когда некоторые значения в разобранной строке были пустыми.

Пример:

 <typ>TYPE_1</typ>
 <rte>AL38941XXXXX</rte>
 <sts>ADDED</sts>
 <ref>
 </ref>

Затем requests пытается выполнить запрос с параметром ' ' в пустом теге, что приводит к неверному результату запроса.

Я не очень хорошо разбираюсь в регулярных выражениях, поэтому попробовал >\n\s+</ в другом регулярном выражении, потерпел неудачу и взломал его так:

text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)    
prettyXml = text_re.sub('>\g<1></', uglyXml).replace('>\n ', '><').replace('>\n  ', '><')

И вся "милая" разметка, к сожалению, исчезла ... Это вроде работает, но как это сделать правильно?

1 Ответ

0 голосов
/ 27 августа 2018

Как видно из комментариев, не беспокойтесь о предварительном подтверждении вывода.

Если в целях отладки вы хотите выполнить предварительное подтверждение и вам нужно полагаться на BeautifulSoup для этой задачи + дополнительный шаг для «исправления»текстовые узлы, вы можете попробовать с этим регулярным выражением:

(<([^\/>]+)>)\s+(?:([\s\S]*?)\s+)??(<\/\2>)

Заменить на: $1$3$4

Демо

Однако имейте в виду, что регулярные выражения не могут быть правильным инструментом для этого.Доказательством является то, что предыдущее регулярное выражение потерпит неудачу с содержимым CDATA, например так:

 <sts>
   <![CDATA[
    </sts>
   ]]>
 </sts>

Конечно, мы можем точно настроить регулярное выражение для рассмотрения разделов CDATA, но даже в этом случае оно может оказаться склонным к какой-либо другой проблеме.,Так что было бы лучше использовать анализатор XML.Или даже лучше использовать какой-нибудь beautifier XML, который бы не позволял менять текстовые узлы.Я думаю, что по такому вопросу, который вы связали, было несколько рекомендаций.

...