[PYTHON] Belles éclaboussures de soupe

Origine

J'ai décidé d'extraire uniquement le texte nécessaire du rapport (format HTML) craché par un outil d'analyse statique C ++ d'une certaine entreprise, j'ai donc commencé avec Python2.7 + Beautifulsoup4.

bs4test.py


from bs4 import BeautifulSoup

soup = BeautifulSoup(open("rep_38248_dev1.html"))
print soup.prettify("shift_jis")

Il ne lit qu'environ 2500 lignes, soit 1/10 du HTML entier (environ 26 000 lignes) !! Affaibli. Submergé. J'étais en difficulté.

Voyage d'exploration

La manière habituelle de le faire est de «trouver des personnes dans la même situation en ligne». Immédiatement, lorsque je recherche sur google ... je n'ai aucune information. Tohoho.

Il n'y a aucun moyen, alors je fouille avec le code source bs4 et je l'ai recherché. La cause était un bogue dans la méthode feed () de lxml que bs4 appelait en tant que sous-traitant, et quand il était alimenté avec un énorme texte HTML, il se renversait en cours de route.

La solution de contournement consiste simplement à commenter LXMLTreeBuilder.feed () dans bs4 / builder / _lxml.py. (Pour une raison quelconque, l'analyseur XML LXMLTreeBuilderForXML.feed () a été corrigé)

bs4/builder/_lxml.py


class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):

    features = [LXML, HTML, FAST, PERMISSIVE]
    is_xml = False

    def default_parser(self, encoding):
        return etree.HTMLParser

#    def feed(self, markup):
#        encoding = self.soup.original_encoding
#        try:
#            self.parser = self.parser_for(encoding)
#            self.parser.feed(markup)
#            self.parser.close()
#        except (UnicodeDecodeError, LookupError, etree.ParserError), e:
#            raise ParserRejectedMarkup(str(e))

Fin

Encore une fois sur Google, il est lié au [forum beautifulsoup] du groupe Google (https://groups.google.com/forum/?fromgroups=#!searchin/beautifulsoup/lxml/beautifulsoup/Q4Ko7aXMS3k/yJrVxg2xtlkJ) Il y avait un message. LXMLTreeBuilderForXML.feed () semble avoir été corrigé en ce moment. Ainsi, la modification de LXMLTreeBuilder a été divulguée ...

Recommended Posts

Belles éclaboussures de soupe
Belle soupe
Belle note de soupe
Ma belle soupe (Python)
Gratter avec une belle soupe
Grattage de table avec belle soupe
Pratique de l'exploration avec Beautiful Soup
Essayez de gratter avec Python + Beautiful Soup
Un mémorandum lors de l'utilisation d'une belle soupe
Racler plusieurs pages avec Beautiful Soup
[Python] Un mémorandum de belle soupe4
Grattage avec Python et belle soupe
Gratter avec une belle soupe en 10 minutes
Grattage de site Web avec Beautiful Soup en Python
[Python3] Comprendre les bases de Beautiful Soup
[Python] Gratter une table avec Beautiful Soup
Supprimez les balises HTML indésirables avec Beautiful Soup
Méthodes fréquemment utilisées de sélénium et de belle soupe
Comment rechercher des données HTML à l'aide de Beautiful Soup