selfClosingTags в BeautifulSoup - PullRequest
       25

selfClosingTags в BeautifulSoup

4 голосов
/ 06 февраля 2010

Использование BeautifulSoup для анализа моего XML

import BeautifulSoup

soup = BeautifulSoup.BeautifulStoneSoup( """<alan x="y" /><anne>hello</anne>""" ) # selfClosingTags=['alan'])

print soup.prettify()

Будет выведено:

<alan x="y">
 <anne>
  hello
 </anne>
</alan>

т. Е. Тег anne является потомком тега alan.

Если при создании супа я передам selfClosingTags = ['alan'], я получу:

<alan x="y" />
<anne>
 hello
</anne>

Отлично!

Мой вопрос: почему нельзя использовать присутствие /> для обозначения самозакрывающегося тега?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

Вы спрашиваете, что задумал автор, заметив, что он дает имена, такие как Beautiful [Stone] Soup, классам / модулям: -)

Вот еще два примера поведения BeautifulStoneSoup:

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>"""
    )
>>> print soup.prettify()
<alan x="y">
 <anne>
  hello
 </anne>
</alan>

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>""",
    selfClosingTags=['alan'])
>>> print soup.prettify()
<alan x="y" />
<anne>
 hello
</anne>
>>>

Мое мнение: самозакрывающийся тег недопустим, если он не определен синтаксическим анализатором. Таким образом, у автора был выбор при решении, как обрабатывать недопустимый фрагмент, такой как <alan x="y" /> ... (1) предположить, что / был ошибкой (2) трактовать alan как самозакрывающийся тег совершенно независимо от того, как он может быть использован в другом месте во входных данных (3), сделайте 2 прохода над входом, выкручивая в первом проходе, как использовался каждый тег. Какой выбор вы предпочитаете?

1 голос
/ 06 февраля 2010

У меня нет «почему», но это может вас заинтересовать.Если вы используете BeautifulSoup (без камня) для анализа XML с помощью самозакрывающегося тега, это работает.Сортировка:

>>> soup = BeautifulSoup.BeautifulSoup( """<alan x="y" /><anne>hello</anne>""" ) # selfClosingTags=['alan'])
>>> print soup.prettify()
<alan x="y">
</alan>
<anne>
 hello
</anne>

Вложенность правильная, даже если alan отображается как начальный и конечный тег.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...