2011-10-04 46 views
3

我需要刪除所有不需要的所有<p>。如將<div><p>xxxx</p></div>轉換爲<div>xxxx</div>Python中的DOM操作(如果一些元素只包含一個其他元素...)

我怎樣才能做到這一點與DOM? 「如果<div>裏面只有一個<p>,那麼將<p>的文本分配給<div>並刪除此<p>」。

我願意這樣做正則表達式,但有些人說這是不好的。我無法想象它是如何處理DOM的。

text = "<div><p>xxxx</p></div>" 
??? 

是否可以使用DOM來解決?或者好的舊正則表達式對這種情況更好?
Python,而不是JavaScript。

+0

我沒有時間,現在,但我認爲這是我一直在用xml.dom.minidom – heltonbiker

回答

6

這個工作對我來說:

from xml.dom import minidom 

text = "<div><p>xxxx</p></div>" 
doc = minidom.parseString(text) 

# For each div in the root document 
for tag in doc.childNodes: 
    # If it's a <p> and there's only one 
    if len(tag.childNodes) == 1 and tag.childNodes[0].tagName == 'p': 
     # p_node = <p>xxx</p> 
     p_node = tag.childNodes[0] 
     # p_text_node = xxx 
     p_text_node = p_node.childNodes[0] 
     value = p_node.nodeValue 
     # Delete the <p>xxx</p> 
     p_node.parentNode.removeChild(p_node) 
     # Set the <div></div> -> <div>xxx</div> 
     tag.appendChild(p_text_node) 

print doc.toxml() 

和產量:

<?xml version="1.0" ?><div>xxxx</div> 

我希望你能接受我給你的其他問題的答案也因爲我把所有的工作適合你;在@jterrace答案)

-3

如果你有jquery,這將工作。

$('div').each(function() { 

    if ($(this).children().length > 1) 
     return 

    if ($(this).children()[0].tagName != "P") 
     return 

    this.innerHTML = $(this).children()[0].innerHTML; 
}); 
+0

不是Python的 –

+0

哈做得相當可能的,我錯過了一部分。 – Porco

6

下面是使用BeautifulSoup一種方法可以做到這一點:

>>> import BeautifulSoup 
>>> somehtml = '<html><title>hey</title><body><p>blah</p><div><p>something</p></div></body></html>' 
>>> soup = BeautifulSoup.BeautifulSoup(somehtml) 
>>> for p in soup.findAll('p'): 
... if p.parent.string is None and len(p.parent.contents) == 1: 
...  p.parent.string = p.string 
...  p.extract() 
>>> soup 
<html><title>hey</title><body><p>blah</p><div>something</div></body></html> 

這個搜索有沒有內容的父母只有一個孩子(的<p>元素)的所有<p>元素,然後複製將<p>元素的內容添加到父項,並刪除<p>元素。

-1

大廈:

(請SO編輯這個問題,我T完成或評論)

我想要走的路是創建一個minidom.Document,以便您可以修改其xml節點。

#coding: utf-8 

from xml.dom import minidom 

text = "<div><p>xxxx</p></div>" 

dom = minidom.parseString(text) 

for p in dom.getElementsByTagName('p'): 
    print p.childNodes 
    # and what now? 
相關問題