我在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
答案 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.parent
或print node.contents
或print node.previous.contents
来查看您的位置。一旦看到HTML,您可能会发现导致print node.next.contents
成为node.parent
的病态情况。