使用Python按顺序解析XML

使用Python按顺序解析XML,python,xml,xml-parsing,Python,Xml,Xml Parsing,我正在尝试解析一个XML文档。例如,文档中嵌入了类似HTML的格式 <p>This is a paragraph <em>with some <b>extra</b> formatting</em> scattered throughout. </p> 来处理XML文档,但我不确定这是否提供了我想要的功能。我将如何处理这里的文本节点 还有,是否有办法在文档中查找结束标记 谢谢 如果您的XML文档适合内存,那么应该使用内

我正在尝试解析一个XML文档。例如,文档中嵌入了类似HTML的格式

<p>This is a paragraph
 <em>with some <b>extra</b> formatting</em>
 scattered throughout.
</p>
来处理XML文档,但我不确定这是否提供了我想要的功能。我将如何处理这里的文本节点

还有,是否有办法在文档中查找结束标记


谢谢

如果您的XML文档适合内存,那么应该使用内存,这样可以更清晰地访问文档。您将能够选择一个节点并自动与其子节点交互;每个节点都有一个
.next
命令,该命令将遍历文本直至下一个标记

因此:

>>b=BeautifulSoup.BeautifulStoneSoup(这是一个段落,段落中分散了一些额外的格式。

) >>>b.find('p') 这是一个段落,段落中分散了一些额外的格式

>>>b.查找('p')。下一步 “这是一段” >>>b.查找('p')。下一个。下一个 加上一些额外的格式
那,或者类似的东西,应该能解决你的问题


如果它不适合内存,则需要对SAX解析器进行子类化,这需要更多的工作。要做到这一点,您可以使用xml.parser导入expat并编写用于打开和关闭标记的处理程序。它有点复杂。

您研究过XMLTree的文档吗?加载文档时,“结束标记”的概念不存在,因为文档已呈现到DOM节点中。如果需要访问标记本身,则必须使用SAX解析器并自己处理开始标记和结束标记事件。然而,由于结束标记不能有属性,所以不清楚为什么需要访问它们。PHP中的XMLReader(一个不构造完整树的获取阅读器)确实给了我结束标记,我发现它非常方便:我使用成对的开始/结束标记和堆栈来确保我收到的XML文档中有合法嵌套的标记。在这种情况下,您希望以与在PHP中使用XMLReader相同的方式使用Python的SAX解析器。我没有在Python中使用过SAX,但是SAX使用了一个事件驱动模型,在这个模型中,您可以得到开始标记、结束标记、属性、文本节点等的回调。谢谢Jim的提示!目前,我正在修补BeautifulSoup,但提取上下文的时间比实现验证器的时间要多。我想我可能能够构建一个soupy验证器,但也许只是为了学习我可能会使用SAX来实现这一点……试图找出如何使bs4可用于MacPorts python 3.3安装。似乎无法实现这一点……pip可能是安装像这样的Python软件包的最简单的方法。没有任何适用于Python 3.3的软件。这花了一段时间。我卸载了Python3.3(MacPorts),然后安装了Python3.2和Py32PIP模块。我必须关闭终端,打开一个新的,然后pip下载了BeautifulSoup4,我可以很好地复制你的例子。看起来BS4正是我想要的:)作为后续:为了更好地支持行号、XML模式和Xpath、大文档支持以及更好更快地访问XML文档,我转而使用lxml。BS很好,但是太面向HTML了。不过,PythonLXML包中确实包含BS4。
import xml.etree.cElementTree as xmlTree
>>> b = BeautifulSoup.BeautifulStoneSoup("<p>This is a paragraph <em>with some <b>extra</b> formatting</em> scattered throughout.</p>")

>>> b.find('p')
<p>This is a paragraph <em>with some <b>extra</b> formatting</em> scattered throughout.</p>

>>> b.find('p').next
u'This is a paragraph '

>>> b.find('p').next.next
<em>with some <b>extra</b> formatting</em>