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

Qia*_*iao 3 python dom

我需要删除所有不需要<p>的地方.如转换<div><p>xxxx</p></div><div>xxxx</div>.

我怎么能用DOM做到这一点?"如果<div>只有一个<p>内部,那么分配该<p>文本<div>并删除它<p>".

我会用正则表达式来做,但有些人说它很糟糕.我无法想象它是如何完成DOM的.

text = "<div><p>xxxx</p></div>"
???
Run Code Online (Sandbox Code Playgroud)

是否可以用DOM解决?或者好的旧正则表达式对于这种情况更好?
Python,而不是JavaScript.

Mat*_*son 7

这对我有用:

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()
Run Code Online (Sandbox Code Playgroud)

和产量:

<?xml version="1.0" ?><div>xxxx</div>
Run Code Online (Sandbox Code Playgroud)

我希望你能接受我给你的另一个问题的答案,因为我为你做了所有的工作;)


jte*_*ace 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>
Run Code Online (Sandbox Code Playgroud)

这将搜索<p>父级没有内容且只有一个子级(<p>元素)的所有元素,然后将<p>元素的内容复制到父级并删除该<p>元素.