如何从中删除CDATA标记,但使用LXML或BeautifulSoup保留Python中的实际数据

时间:2014-01-30 02:11:57

标签: python xml beautifulsoup lxml cdata

我有一些我正在解析的XML,其中我使用BeautifulSoup作为解析器。我使用以下代码将CDATA拉出来,但我只想要数据而不是CDATA TAGS。

    myXML = open("c:\myfile.xml", "r")
    soup = BeautifulSoup(myXML)
    data = soup.find(text=re.compile("CDATA"))

    print data

    <![CDATA[TEST DATA]]>

如果以下输出我希望看到:

测试数据

我不在乎解决方案是在LXML还是BeautifulSoup中。只想要最好或最简单的方法来完成工作。谢谢!


这是一个解决方案:

    parser = etree.XMLParser(strip_cdata=False)
    root = etree.parse(self.param1, parser)
    data = root.findall('./config/script')
    for item in data:  # iterate through list to find text contained in elements containing CDATA
        print item.text

2 个答案:

答案 0 :(得分:2)

基于lxml docs

>>> from lxml import etree
>>> parser = etree.XMLParser(strip_cdata=False)
>>> root = etree.XML('<root><data><![CDATA[test]]></data></root>', parser)
>>> data = root.findall('data')
>>> for item in data:  # iterate through list to find text contained in elements containing CDATA
    print item.text

test  # just the text of <![CDATA[test]]>

这可能是完成工作的最佳方式,具体取决于xml结构对此方法的适用程度。

答案 1 :(得分:0)

基于BeautifulSoup:

>>> str='<xml>  <MsgType><![CDATA[text]]></MsgType>  </xml>'
>>> soup=BeautifulSoup(str, "xml") 
>>> soup.MsgType.get_text()
u'text'
>>> soup.MsgType.string
u'text'
>>> soup.MsgType.text
u'text'

结果,它只打印来自msgtype;

的文本