2014-01-30 1 views
1

У меня есть XML, который я обрабатываю, в котором я использую BeautifulSoup в качестве синтаксического анализатора. Я вытаскиваю CDATA со следующим кодом, но мне нужны только данные, а не CDATA TAGS.Как удалить теги CDATA, но сохранить фактические данные в Python, используя LXML или BeautifulSoup

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

    print data 

    <![CDATA[TEST DATA]]> 

То, что я хотел бы видеть, если следующий вывод:

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 
+1

См. Http://stackoverflow.com/questions/2032172/how-can-i-grab-cdata-out-of-beautifulsoup. – alecxe

+0

Только то, что я искал. Это тоже хорошо. – user2643864

ответ

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 относится к такому подходу.

+0

Спасибо за ответ. Я пробовал это раньше, но не понял, что что-то не так с моей установкой lxml. С тех пор я попробовал ваш пример, и это именно то, что мне нужно. Для тех, кому нужен еще один угол ответа, я просто изменил его, чтобы проанализировать исходный файл (self.param1) и изменить значение данных, чтобы указать на XPATH ('./config/script'). Это сработало хорошо! – user2643864

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;