Python中的DOM操作(如果某个元素只包含一个其他元素……)

5 投票
4 回答
10190 浏览
提问于 2025-04-17 03:40

我需要去掉那些不必要的 <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>

我希望你也能接受我为你另一个问题提供的答案,因为我为你花了很多心思;)

撰写回答