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é.
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))
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