Python中的DOM操作(如果某个元素只包含一个其他元素……)
我需要去掉那些不必要的 <p>
标签。比如,把 <div><p>xxxx</p></div>
转换成 <div>xxxx</div>
。
我该怎么用 DOM 来实现呢?“如果 <div>
里面只有一个 <p>
,那么就把那个 <p>
的内容赋值给 <div>
,然后把这个 <p>
删除。”
我其实更想用 正则表达式 来做,但有些人说这样不好。我想象不出用 DOM 怎么实现。
text = "<div><p>xxxx</p></div>"
???
用 DOM 真的能解决这个问题吗?还是说老老实实用正则表达式更好呢?
用的是 Python,不是 JavaScript。
4 个回答
-1
在@jterrace的回答基础上:
(请编辑这个问题,让它更完整,或者留言评论)
我觉得可以创建一个 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?
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>
元素。
8
这个对我有效:
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>
我希望你也能接受我为你另一个问题提供的答案,因为我为你花了很多心思;)