Beautiful Soup это один из способов можно разобрать это красиво (и это так, я бы всегда сделать это, если не было какой-то очень хорошая причина, чтобы не делать это так, я сам). Это намного проще и понятнее, чем использование SGMLParser.
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''<post id='100'> <title> new title </title> <text> <p> new text </p> </text> </post>''')
>>> soup('post') # soup.findAll('post') is equivalent
[<post id="100"> <title> new title </title> <text> <p> new text </p> </text> </post>]
>>> for post in soup('post'):
... print post.findChild('text')
...
<text> <p> new text </p> </text>
Как только вы получите его на этом этапе, вы можете делать с ним разные вещи, в зависимости от того, как вы этого хотите.
>>> post = soup.find('post')
>>> post
<post id="100"> <title> new title </title> <text> <p> new text </p> </text> </post>
>>> post_text = post.findChild('text')
>>> post_text
<text> <p> new text </p> </text>
Возможно, вам захочется вычеркнуть HTML.
>>> post_text.text
u'new text'
Или, возможно, взглянуть на содержимое ...
>>> post_text.renderContents()
' <p> new text </p> ']
>>> post_text.contents
[u' ', <p> new text </p>, u' ']
Есть все виды вещей, которые вы могли бы хотеть сделать. Если вы более конкретны - особенно, предоставляя реальные данные - это помогает.
Когда дело доходит до манипулирования деревом, вы тоже можете это сделать.
>>> post
<post id="100"> <title> new title </title> <text> <p> new text </p> </text> </post>
>>> post.title # Just as good as post.findChild('title')
<title> new title </title>
>>> post.title.extract() # Throws it out of the tree and returns it but we have no need for it
<title> new title </title>
>>> post # title is gone!
<post id="100"> <text> <p> new text </p> </text> </post>
>>> post.findChild('text').replaceWithChildren() # Thrown away the <text> wrapping
>>> post
<post id="100"> <p> new text </p> </post>
И так, в конце концов, вы бы что-то вроде этого:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''
... <post id='100'> <title> new title 100 </title> <text> <p> new text 100 </p> </text> </post>
... <post id='101'> <title> new title 101 </title> <text> <p> new text 101 </p> </text> </post>
... <post id='102'> <title> new title 102 </title> <text> <p> new text 102 </p> </text> </post>
... ''')
>>> for post in soup('post'):
... post.title.extract()
... post.findChild('text').replaceWithChildren()
...
<title> new title 100 </title>
<title> new title 101 </title>
<title> new title 102 </title>
>>> soup
<post id="100"> <p> new text 100 </p> </post>
<post id="101"> <p> new text 101 </p> </post>
<post id="102"> <p> new text 102 </p> </post>
что вы хотите сделать? проанализировать файл html? – virhilo
У меня есть большой текстовый файл с SGML, где у меня есть теги формата <идентификатор сообщения = «100»>
новый текст