Проблема использования replaceWith для замены тегов HTML на BeautifulSoup на Python - PullRequest
1 голос
/ 11 августа 2010

Я использую BeautifulSoup в Python и не могу заменить некоторые теги.Я нахожу <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'

Я делаю то же самое, заменив node выше в цикле for, и он работает правильно.Я предполагаю, что у него есть проблемы из-за дополнительной итерации через узел как n.

Что я делаю не так или как лучше это сделать?Спасибо!PS.Я использую Python 2.5 для Google Appengine и BeautifulSoup 3.0.8.1

1 Ответ

1 голос
/ 11 августа 2010

Ошибка говорит:

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

Этот код встречается в строке 131 BeautifulSoup.py.Он говорит, что self.parent - это None.

Просмотр окружающего кода показывает, что self должно равняться node в вашем коде, поскольку node вызывает его метод replaceWith (Примечание:в сообщении об ошибке указано node.replaceWith, но код, который вы разместили, показывает n.replaceWith. Код, который вы опубликовали, не соответствует сообщению об ошибке / трассировке.) Поэтому, очевидно, node.parent - это None.

Вероятно, вы могли бы избежатьошибка, помещая

if node.parent is not None:

в некоторый момент в коде до вызова node.replaceWith.

Редактировать: я предлагаю вам использовать операторы print, чтобы выяснить, где в HTML вы находитеськогда node.parent Нет (т. е. где происходит ошибка).Возможно, используйте print node.contents или print node.previous.contents или print node.next.contents, чтобы увидеть, где вы находитесь.Как только вы увидите HTML, может стать очевидным, в какой патологической ситуации вы находитесь, node.parent будет None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...