2017-10-20 100 views
0

正如mzjn所提示的,我正在改變整個問題並試圖簡化它。Python lxml庫中沒有空標記

我有這樣的XML:

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">A list of things</span>: Element1, element2, element3, element4 element5.</p> 
    </body> 
</Element> 
</Content> 

我要修改的列表的內容和替換 「」 爲 「<,>」。我有這樣的代碼:

from lxml import etree as et 
def replace_commas(file): 
    parser = et.parse(str(file)) 
    root = parser.getroot() 
    xpath_expr = "//Element[starts-with(@Ref,'List_') \ 
or @GroupName='Lists']/descendant::*" 
    elements = root.xpath(xpath_expr) 
    for element in elements: 
     if element.text is not None or element.tail is not None: 
      text = str(element.text) 
      text = text.replace(',', '<,>') 
      tail = str(element.tail) 
      tail = tail.replace(',','<,>') 
      element.text = text 
      element.tail = tail 
    tree = et.ElementTree(root) 
    tree.write(file, pretty_print=True) 

預期輸出應該是:

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">A list of things</span>: Element1&lt;,&gt; element2&lt;,&gt; element3&lt;,&gt; element4 element5.</p> 
    </body> 
</Element> 
</Content> 

但是我的結果是:

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p>None<span class="bold">A list of things</span>: Element1&lt;,&gt; element2&lt;,&gt; element3&lt;,&gt; element4 element5.</p> 
    </body> 
</Element> 
</Content> 

獲取標籤 「p」 和「跨度之間的無「而且什麼都不應該。哪裏不對?

我希望此問題的更新有助於瞭解查詢並找到解決方案。

更新:更正了def replace_commas(file)中的冒號:和et.ElementTree(root)的縮進。

另外,我發現mzjn提供的解決方案在哪裏給出錯誤。我在我的xml這個元素:

<Element Ref="List_222"ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">List: <span class="italic">Important elements</span></span>: El1 (prop1), el2 (prop2), el3 (prop3); with a special property.</p> 
    </body> 
</Element> 

在此元素我得到了重要元素的尾部NoneType,因爲它得到值無。

我看不到如何解決它。

+0

你可以添加理想的情況嗎? – Jonathan

+0

我已經添加了理想的情況下,這將與沒有None值的空元素,我已經添加了一些關於我的小原因研究的信息。但是我還沒有找到任何。 – TMikonos

+0

請簡化問題並創建[mcve]。 – mzjn

回答

1

如果元素的text屬性爲空(沒有值),則返回內置常量None

第二個<p>元素的text屬性爲空。但是,您使用text = str(element.text),這使text變量等於字符串'None'。這就是你在輸出中看到的。

如果檢查texttail分別對每一個元素,它應該工作:

for element in elements: 
    if element.text is not None: 
     element.text = element.text.replace(',', '<,>') 
    if element.tail is not None: 
     element.tail = element.tail.replace(',', '<,>') 
+0

我得到了element.tail中的錯誤,因爲我得到一個NoneType對象沒有屬性替換。 – TMikonos

+0

'if element.tail不是None:'是爲了防止這樣的錯誤。我無法解釋你爲什麼得到這個錯誤。您需要提供更多信息。 – mzjn

+0

它給我一個空的元素:

。這很奇怪。我不知道哪裏看起來更多。 – TMikonos

0

找我終於找到了解決的空尾後。相反,如果檢查的內容是不是空的,我已經解決了它檢查是否是無什麼也不做,就繼續:

for element in elements: 
    if element.text is None: 
     continue 
    else: 
     element.text = element.text.replace(',','<,>') 
    if element.tail is None: 
     continue 
    else: 
     element.tail = element.tail.replace(',','<,>') 
    tree = et.ElementTree(root) 
    tree.write(args.file, pretty_print=True) 

用此修復程序圍繞我已經能夠解決這個問題。