Je voudrais analyser les fichiers texte (stockés localement) avec le etree de LXML. Mais tous mes fichiers (des milliers) ont des en-têtes, tels que: et le premier ne dépasse pas la ligne 51 dans ce cas (et n'est pas 51 Dans tous les cas). Les portions XML démarrent comme suit: P>
from lxml import etree
f = etree.parse('temp.txt')
XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1
4 Réponses :
Bien que la définition de problème implique que vous souhaitiez commencer à analyser à la première '<', je ne pense pas que ce soit une bonne idée. Ceux-ci ressemblent à des en-têtes PEM (sinon, ils sont quelque chose d'autre dérivé de RFC (2) 822), et ils pourraient avoir des caractères «<». Par exemple, vous pouvez trouver Si vous souhaitez analyser en tant que message RFC822 avec un corps XML, C'est assez facile: p> mais techniquement, cela n'est pas valide pour PEM (car le format de l'en-tête de PEM est efficacement une fourchette de RFC822 plutôt que de l'incorporer par référence). Et cela peut ne pas être même pratiquement em> valable pour divers autres formats similaires non-RFC822. Et vraiment, tout ce que vous aimez est de savoir comment les en-têtes et les corps sont séparés, ce qui est une règle très simple: p> L'autre alternative consiste à compter sur le fait (apparent) que Le corps est toujours un nœud sec-document: p> une dernière note: En règle générale, une fois que vous avez vu des en-têtes RFC822, la question de savoir si le format est réellement complet RFC2822 + MIME facultatif. Le fait qu'il n'y ait pas d'en-têtes de contenu nulle part cela implique que vous soyez probablement en sécurité ici, mais vous voudrez peut-être grep une grande collection d'entre eux (ou, s'il y a une définition du format de fichier quelque part, écoulez-la). P> p> nom d'origine: "foo bar"
Comme le souligne Lukas Graf ci-dessus, le corps semble être un document SGML plutôt qu'un XML un, auquel cas tout cela vous permettra de passer le premier obstacle au point où votre analyse XML peut commencer à omettre les bonnes raisons. des mauvaises ...
Ouais. Vous utilisez un analyseur HTML ou même magnifique de LXML pour obtenir quelque chose i> en dehors de celui-ci, mais il semble imbriquer de manière incorrecte les étiquettes implicitement fermées.
@LUKASGRAF - Tu as raison. Même si je paire correctement
etree code> me jette des erreurs. Mais si j'utilise
html code> de lxml, je peux obtenir des résultats. Clairement, j'ai beaucoup plus de travail ici. Merci!
J'ai édité ma réponse pour faire face au fait que ceci est PEM, pas strictement parlant RFC822. Je ne l'ai pas modifié pour faire face au fait que c'est SGML plutôt que XML, car je ne peux pas améliorer la réponse de Lukas, et si cela n'est pas utile en tant que réponse supplémentaire montrant comment analyser l'en-tête, je plutôt simplement le supprimer.
Vous pouvez facilement accéder au texte encapsulé du L'analyse SGML est beaucoup plus difficile. Voici une tentative qui semble fonctionner avec un Document de Edgar A>: p> résultat: p>
Merci, Lukas. Donc, pour vous assurer de bien comprendre, car SGML est moins structuré que XML ou HTML, le meilleur que je puisse espérer est une solution plus manuelle?
Fb. Joli. Merci pour l'aide! Je dois courir, mais je vais essayer cela ce soir. Merci.
Exactement. SGML permet des balises implicitement fermées, dans cet exemple
lxml.html code> il semble les nicher au lieu de les garder à plat.
Ce n'est pas vraiment que SGML soit «moins structuré», mais qu'il est plus flexible et sans savoir quelle langue SGML vous utilisez, vous êtes plus dans le noir. XML et HTML, au moins certaines versions d'entre eux, sont eux-mêmes des langues SGML. En termes informels, la lecture de XML sans DTD est comme la lecture de quelque chose qui pourrait être standard élevé allemand ou yiddish; Lire SGML sans DTD, c'est comme lire quelque chose qui est soit un dialecte de l'allemand ou du dialecte de l'anglais ...
@Abarnert True, XML et HTML sont des sous-ensembles de SGML. Et +1 pour une grande métaphore :)
Strictement parlant, HTML 3-4 sont des langues SGML et des sous-ensembles de SGML, mais plus tôt HTML n'est pas tout à fait, et HTML5 est ... Eh bien, une langue abstraite avec deux sérialisations concrètes, dont l'une ressemblait beaucoup à une langue SGML mais est explicitement défini à ne pas être. (L'autre est bien sûr une langue XML et XML est une langue SGML, vous pourriez donc dire que HTML est toujours SGML ... sauf qu'il est possible d'écrire des documents HTML5 qui ne sont pas "Polyglot" et ne peuvent pas être sérialisés dans XHTML. ) Je n'en mentionnerais aucun de cela, mais l'OP semblait enthousiasmé d'avoir tant de choses nouvelles à apprendre. :)
@Abarnert - Je ne sais pas si "excité" est le mot juste. Je suppose que ce n'est pas un projet de l'après-midi. :) Merci à vous deux pour toute l'aide!
Étant donné qu'il y a une norme pour ces fichiers, il est possible d'écrire un analyseur approprié plutôt que de deviner des choses ou d'espérer que Beauxoupe obtient les choses correctement. Cela ne signifie pas que c'est la meilleure réponse pour vous, mais cela fonctionne certainement. P>
Selon la norme chez http://www.sec.gov/info/edgar/pdsdissemspec910.pdf < / a> Qu'est-ce que vous avez (à l'intérieur de l'enceinte PEM) est un document SGML défini par la DTD fourni. Donc, d'abord aller aux pages 48-55, extrayez le texte et enregistrez-le comme, dites, "edgar.dtd". P>
La première chose que je ferais est d'installer SP et utilisez ses outils pour vous assurer que les documents sont vraiment valides et analysable par cette DTD, pour vous assurer de ne pas perdre de temps sur quelque chose qui ne va pas tomber. P>
Python est livré avec un analyseur SGML validant, Sgmllib. Malheureusement, il n'a jamais été assez fini et il est obsolète en 2.6-2.7 (et enlevé en 3.x). Mais cela ne signifie pas que cela ne fonctionnera pas. Alors, essayez-le et voyez si cela fonctionne. P>
Sinon, je ne sais pas de bonnes alternatives dans Python; La plupart du code SGML se trouve dans C, C ++ ou Perl. Mais vous pouvez conclure n'importe quelle bibliothèque C ou C ++ (je commencerais avec SP) assez facilement, tant que vous êtes à l'aise d'écrire votre propre enveloppé dans C / Cyron / Boost-Python / Peu importe ou utilisez CTTPES. Il vous suffit de terminer les fonctions de niveau supérieur, de ne pas construire un ensemble complet de fixations. Mais si vous n'avez jamais fait quelque chose comme ça avant, ce n'est probablement pas le meilleur moment pour apprendre. P>
Alternativement, vous pouvez envelopper un outil de ligne de commande. SP vient avec NSGMLS. Il y a un autre bon outil écrit à Perl avec le même nom (je pense faire partie de http://savannah.nongnu.org/projects/perlsgml / mais je ne suis pas positif.) Et des dizaines d'autres outils. P>
ou, bien sûr, vous pouvez écrire le tout ou simplement la couche analysante, à Perl (ou C ++) au lieu de python. P>
Merci! Tellement d'apprendre ici. J'ai eu de la chance avec beauxonstonos code> (recommandé par @jterrace). Je souhaite la possibilité de trouver rapidement une section donnée et de rechercher le texte, donc je pense que BSS fera bien (bien que je dois laisser tomber de nombreux "\ n" et "& nbsp" de la liste).
J'essaierais d'exécuter les NSGML de SP sur certains des documents, avec la DTD, et voyez si la sortie a l'air correcte. Vous voudrez peut-être toujours utiliser Beautifulsoup uniquement pour la simplicité, mais cela vaut la peine de savoir si vous avez d'autres options. (Si les documents ne valident pas, vous n'avez aucune autre option; s'ils le font, vous le faites.)
Merci! La solution complète me prendra du temps (trop de plaques filant), mais merci pour les pointeurs!
Cher @Richardherherron Je suis actuellement sur le travail. J'essaie de faire la même chose exacte pour les 2 dernières années! J'ai les fichiers téléchargés comme txt code> mais je ne sais pas comment utiliser le
beauxoup code> en raison du format TXT. Je suis un passionné de financement et j'ai vraiment besoin de cruncher des données. N'hésitez pas à me laisser tomber une ligne et de parler si vous avez le temps. Vous seriez un économiseur de vie.
Vous ne pouvez pas sauter des lignes en combinant fichier.Lead () et stringio?
Ah ok. Laissez-moi apprendre à propos de ceux-ci (désolé, juste commencer, et ce n'est pas dans le fichier man, puis je ne suis parfois pas sûr de la fonction à rechercher ensuite). Merci!
Oh pas de problème, vous pouvez sauter des lignes avec un fichier ouvert à l'aide de fichier.readline (), puis vous pouvez utiliser etree.parse (fichier). Le Stringio est parce que je n'étais pas sûr si parse () accepte les objets de fichier, oubliez-le.
On dirait que les en-têtes sont au format RFC822, ce qui signifie qu'il n'y a aucune garantie qu'il n'y aura pas de '<' quelque part dans les en-têtes. J'utiliserais soit du code d'analyse de la RFC822, soit juste en ligne jusqu'à ce que je reçoive une ligne vide.
Tout d'abord, vous devez absolument dépouiller les en-têtes PEM avant de tenter d'analyser le balisage. Deuxièmement, malheureusement, c'est SGML, pas XML. L'analyse de SGML correctement est un peu plus difficile que d'analyser XML bien formé. Alors, pourriez-vous réduire les informations que vous avez réellement nécessaires pour extraire? Juste le HTML à l'intérieur du code> nœud, ou aussi n'importe laquelle des métadonnées avant de cela?
@LUKASGRAF - Merci! J'ai seulement besoin du contenu dans le premier code>,
document> code> tags.
@Abarnert - Oui, il y a une norme (merci pour le Nudge) - SEC.GOV /Info/edgar/pdsdissemspec910.pdf