2012-06-22 5 views
1

Учитывая следующий XML:XML блок Анализировать с LXML

<language>en-US</language> 
<provider>VenturesLLC</provider> 
<video> 
    <original_spoken_locale>en-US</original_spoken_locale> 
    <vendor_offer_code>TEST_VENDOR</vendor_offer_code> 
    <release_date>2011-01-15</release_date> 
    <title>Moving Forward</title> 
    <vendor_id>ASDF_ING_2012</vendor_id> 
</video> 

Я ищу, чтобы получить колодку весь<video>. Однако, когда я делаю:

>>> f=open('metadata.xml') 
>>> contents=f.read() 
>>> node=etree.fromstring(contents) 
>>> node.xpath("//*[local-name()='video']")[0].text 
'\n 

Обратите внимание, что если бы я сделал что-то вроде node.xpath("//*[local-name()='original_spoken_locale']")[0].text я получаю правильное значение 'en-US'. Как бы я тяну этот полный текст, так что я могу получить:

text = """  
<video> 
    <original_spoken_locale>en-US</original_spoken_locale> 
    <vendor_offer_code>TEST_VENDOR</vendor_offer_code> 
    <release_date>2011-01-15</release_date> 
    <title>Moving Forward</title> 
    <vendor_id>ASDF_ING_2012</vendor_id> 
</video>""" 

ответ

2

Вашего .text вызов не работает, потому что ваше видео узел не имеет текста - у него есть другие узловые дети. Вы должны преобразовать эти узлы в строку, используя tostring

In [1]: from lxml import etree 

In [2]: xml = '''<xml> 
    ...: <language>en-US</language> 
    ...: <provider>VenturesLLC</provider> 
    ...: <video> 
    ...:  <original_spoken_locale>en-US</original_spoken_locale> 
    ...:  <vendor_offer_code>TEST_VENDOR</vendor_offer_code> 
    ...:  <release_date>2011-01-15</release_date> 
    ...:  <title>Moving Forward</title> 
    ...:  <vendor_id>ASDF_ING_2012</vendor_id> 
    ...: </video></xml>''' 

In [3]: tree = etree.fromstring(xml) 

In [4]: vid = tree.xpath('//video')[0] 

In [5]: etree.tostring(vid, pretty_print=True) 
Out[5]: '<video>\n <original_spoken_locale>en-US</original_spoken_locale>\n <vendor_offer_code>TEST_VENDOR</vendor_offer_code>\n <release_date>2011-01-15</release_date>\n <title>Moving Forward</title>\n <vendor_id>ASDF_ING_2012</vendor_id>\n</video>\n' 

In [6]: print _ 
<video> 
    <original_spoken_locale>en-US</original_spoken_locale> 
    <vendor_offer_code>TEST_VENDOR</vendor_offer_code> 
    <release_date>2011-01-15</release_date> 
    <title>Moving Forward</title> 
    <vendor_id>ASDF_ING_2012</vendor_id> 
</video> 
+0

Вы можете использовать 'node.text_content()', чтобы получить весь текст ниже узла в виде одной строки, или 'node.itertext()' перебрать содержимое каждого текстового узла индивидуально. – spiralx

Смежные вопросы