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() 

  • Der Apache-Server kann beim Laden externer Module in einer Klasse nicht geladen werden
  • Wie bekomme ich alle Texte zwischen nur zwei spezifizierten Tags mit BeautifulSoup?
  • Python und BeautifulSoup verwenden, um eine Tabelle zu analysieren
  • Schöne Suppe wirft `IndexError`
  • Extrahieren von Text aus dem Skript-Tag mit BeautifulSoup in Python
  • Beautifulsoup - Ärger kratzen datalist mit Links in ihm
  • 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.