使用replaceWith在Python上用BeautifulSoup替换HTML标签的问题

时间:2010-08-11 18:56:48

标签: python beautifulsoup

我在Python中使用BeautifulSoup并且无法替换某些标签。我找到<div>标签并检查孩子。如果这些孩子没有孩子(是NODE_TYPE = 3的文本节点),我将他们复制为<p>

from BeautifulSoup import Tag, BeautifulSoup

class bar:

 self.soup = BeautifulSoup(self.input)
 foo()
 def foo(self):    
  elements = soup.findAll(True)

  for node in elements:

    # ....other stuff here if not <div> tags.

    if node.name.lower() == "div":
      if not node.find('a'):
        newTag = Tag(self.soup, "p")
        newTag.setString(node.text)
        node.replaceWith(newTag)
        nodesToScore.append(newTag)
      else:
        for n in node.findAll(True):
          if n.getString():  # False if has children
            newTag = Tag(self.soup, "p")
            newTag.setString(n.text)
            n.replaceWith(newTag)

我收到了一个AttributeError:

  File "file.py", line 125, in function
    node.replaceWith(newTag)
  File "BeautifulSoup.py", line 131, in replaceWith
    myIndex = self.parent.index(self)
AttributeError: 'NoneType' object has no attribute 'index'

我在for循环中替换node更高的位置并且它正常工作。我假设它有问题,因为通过节点作为n的额外迭代。

我做错了什么或做什么更好的方法?谢谢! PS。我正在使用Python 2.5 for Google Appengine和BeautifulSoup 3.0.8.1

1 个答案:

答案 0 :(得分:1)

错误说:

    myIndex = self.parent.index(self)
AttributeError: 'NoneType' object has no attribute 'index'

此代码出现在BeautifulSoup.py的第131行。 它说self.parent是无。

查看周围的代码显示代码中self应该等于node,因为node正在调用其replaceWith方法。(注意:错误消息显示为{ {1}},但您发布的代码显示node.replaceWith。您发布的代码与错误消息/追溯不对应。)显然n.replaceWith是无。

您可以通过放置

来避免错误
node.parent

在调用if node.parent is not None: 之前的代码中的某个时刻。

编辑:我建议您使用node.replaceWith语句来调查当print为无(即发生错误的位置)时HTML中的位置。也许使用node.parentprint node.contentsprint node.previous.contents来查看您的位置。一旦看到HTML,您可能会发现导致print node.next.contents成为node.parent的病态情况。