Schöner Suppe Fehler: '<class' bs4.element.Tag '>' hat kein Attribut 'Inhalt'?

Ich schreibe ein Skript, das den Inhalt aus einem Artikel herauszieht und unnötige Sachen z. Skripte und Styling. Schöne Suppe hält die folgende Ausnahme:

'<class 'bs4.element.Tag'>' object has no attribute 'contents' 

Hier ist der Code der Trimmfunktion (Element ist das HTML-Element, das den Inhalt der Webseite enthält):

 def trim(element): elements_to_remove = ('script', 'style', 'link', 'form', 'object', 'iframe') for i in elements_to_remove: remove_all_elements(element, i) attributes_to_remove = ('class', 'id', 'style') for i in attributes_to_remove: remove_all_attributes(element, i) remove_all_comments(element) # Remove divs that have more non-p elements than p elements for div in element.find_all('div'): p = len(div.find_all('p')) img = len(div.find_all('img')) li = len(div.find_all('li')) a = len(div.find_all('a')) if p == 0 or img > p or li > p or a > p: div.decompose() 

Wenn man die Stapelspur betrachtet, scheint das Problem von dieser Methode direkt nach der Aussage zu kommen:

  # Remove divs that have more non-p elements than p elements for div in element.find_all('div'): p = len(div.find_all('p')) # <-- div.find_all('p') 

Ich verstehe nicht, warum diese Instanz von bs4.element.Tag nicht das Attribut 'Inhalt' hat? Ich habe es auf einer aktuellen Webseite ausprobiert und das Element war voll von p und img's …

Hier ist der Traceback (Das ist Teil eines Django-Projektes, an dem ich arbeite):

 Environment: Request Method: POST Request URL: http://localhost:8000/read/add/ Django Version: 1.4.1 Python Version: 2.7.3 Installed Applications: ('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'home', 'account', 'read', 'review') Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware') Traceback: File "/home/marco/.virtualenvs/sandra/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) File "/home/marco/sandra/read/views.py" in add 24. Article.objects.create_article(request.user, url) File "/home/marco/sandra/read/models.py" in create_article 11. title, content = logic.process_html(web_page.read()) File "/home/marco/sandra/read/logic.py" in process_html 7. soup = htmlbarber.give_haircut(BeautifulSoup(html_code, 'html5lib')) File "/home/marco/sandra/read/htmlbarber/__init__.py" in give_haircut 45. scissor.trim(element) File "/home/marco/sandra/read/htmlbarber/scissor.py" in trim 35. p = len(div.find_all('p')) File "/home/marco/.virtualenvs/sandra/local/lib/python2.7/site-packages/bs4/element.py" in find_all 1128. return self._find_all(name, attrs, text, limit, generator, **kwargs) File "/home/marco/.virtualenvs/sandra/local/lib/python2.7/site-packages/bs4/element.py" in _find_all 413. return [element for element in generator File "/home/marco/.virtualenvs/sandra/local/lib/python2.7/site-packages/bs4/element.py" in descendants 1140. if not len(self.contents): File "/home/marco/.virtualenvs/sandra/local/lib/python2.7/site-packages/bs4/element.py" in __getattr__ 924. "'%s' object has no attribute '%s'" % (self.__class__, tag)) Exception Type: AttributeError at /read/add/ Exception Value: '<class 'bs4.element.Tag'>' object has no attribute 'contents' 

Hier ist der Quellcode von remove_all_ * Funktionen:

 def remove_all_elements(element_to_clean, unwanted_element_name): for to_remove in element_to_clean.find_all(unwanted_element_name): to_remove.decompose() def remove_all_attributes(element_to_clean, unwanted_attribute_name): for to_inspect in [element_to_clean] + element_to_clean.find_all(): try: del to_inspect[unwanted_attribute_name] except KeyError: pass def remove_all_comments(element_to_clean): for comment in element_to_clean.find_all(text=lambda text:isinstance(text, Comment)): comment.extract() 

  • Erstellen eines XML-Dokuments mit BeautifulSoup
  • Gibt es einen Weg in schöner Suppe, um die Anzahl der Tags in einer HTML-Seite zu zählen
  • Python: Ein anderes 'NoneType'-Objekt hat keinen Attributfehler
  • Element extrahieren und ein Leerzeichen einfügen
  • Wie kann man Daten im db django-Modell speichern?
  • Beautifulsoup erkennt nicht lxml
  • One Solution collect form web for “Schöner Suppe Fehler: '<class' bs4.element.Tag '>' hat kein Attribut 'Inhalt'?”

    Ich denke, das Problem ist, dass in remove_all_elements oder irgendwo anders in Ihrem Code Sie löschen das contents von einigen Ihrer Tags.

    Es sieht so aus, als wenn du to_remove.decompose() . Hier ist die Quelle für diese Methode:

     def decompose(self): """Recursively destroys the contents of this tree.""" self.extract() i = self while i is not None: next = i.next_element i.__dict__.clear() i = next 

    Hier ist was passiert, wenn man diese Funktion manuell aufruft:

     >> soup = BeautifulSoup('<div><p>hi</p></div>') >>> d0 = soup.find_all('div')[0] >>> d0 <div><p>hi</p></div> >>> d0.decompose() >>> d0 Traceback (most recent call last): ... Traceback (most recent call last): AttributeError: '<class 'bs4.element.Tag'>' object has no attribute 'contents' 

    Es scheint, dass, sobald Sie auf einem Tag decompose haben, Sie niemals versuchen müssen, dieses Tag erneut zu verwenden. Ich bin mir nicht ganz sicher, wo das passiert ist.

    Eine Sache, die ich versuchen würde zu überprüfen ist, dass len(element.__dict__) > 0 zu allen Zeiten in deiner trim() Funktion.

    Python ist die beste Programmiersprache der Welt.