2010-08-11 3 views
1

Python에서 BeautifulSoup을 사용하고 일부 태그를 바꾸는 데 문제가 있습니다. 나는 <div> 태그를 찾고 아이들을 확인하고 있습니다. 그 아이들이 아이들을 가지고 있지 않다면 (NODE_TYPE = 3의 텍스트 노드입니다), 나는 이것을 <p>으로 복사하고 있습니다. 나도 같은 for 루프에서 node에 최대 높은 대체 할replaceWith를 사용하여 Python에서 BeautifulSoup로 HTML 태그를 바꾸는 데 문제가 발생했습니다.

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' 

하고 올바르게 작동합니다

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를 얻고있다. 노드를 통해 반복되는 n 때문에 문제가 있다고 가정합니다.

내가 잘못했거나 더 좋은 방법은 무엇일까요? 감사! PS. 내가 구글 AppEngine에와 BeautifulSoup로 3.0.8.1 파이썬 2.5을 사용하고

답변

1

오류는 말한다 :

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

이 코드는 BeautifulSoup.py 라인 (131)에 발생합니다. self.parent은 없음이라고 표시되어 있습니다. . 주변의 코드를 보면

nodereplaceWith 방법 (참고를 호출하기 때문에 self, 당신의 코드에서 node 동일해야 함을 보여줍니다 오류 메시지가 node.replaceWith를 말한다,하지만 코드는 당신이 게시 코드는하지 않습니다 n.replaceWith 쇼를 기록했다. 오류 메시지/추적에 해당합니다.) 분명히 node.parent은 없음입니다.

당신은 아마 node.replaceWith 전에 코드의 어떤 시점에서

if node.parent is not None: 

을 배치하여 오류를 방지 할 수가 호출됩니다.

편집 : node.parent이없는 경우 (즉, 오류가 발생한 곳)에 HTML의 위치를 ​​조사하려면 print 문을 사용하는 것이 좋습니다. 현재 위치를 확인하려면 print node.contents 또는 print node.previous.contents 또는 print node.next.contents을 사용할 수 있습니다. HTML을 보게되면 어느 병적 인 상황이 node.parentNone이되는지 분명하게 알 수 있습니다.

+0

'node.replaceWith'와'n.replaceWith'를 확인해 주셔서 감사합니다. 내가 추가 된 코드를 추가했습니다. 'else'가 없다면'not if'가 정상적으로 실행되기 때문에 관련성이 없다고 생각하는 이유가 있지만 잘못되었습니다. – feesta

+0

@feesta : HTML을 보지 않고도 디버그하기가 어렵습니다. 문제에 해당하는 HTML을 어떻게 찾을 수 있는지 제안하는 편집 (위)을 추가했습니다. – unutbu

+0

@ ~ 우분투 감사합니다! 지금 일하고있어! 만약 node.parent가 None이면 (log node) else : (나머지는)'잘못된 HTML은 공백 만있는'div' 태그였습니다. 그게 내가 벗기는 부분의 일부 야. 다시 한번 감사드립니다! – feesta

관련 문제