2011-06-29 5 views
1

J'ai sauvegardé mon blog au format XML de Google. C'est assez long. Jusqu'à présent, je l'ai fait:comment nettoyer toutes les entrées d'un flux feedparser

>>> import feedparser 
>>> blogxml = feedparser.parse('blog.xml') 
>>> type(blogxml) 
<class 'feedparser.FeedParserDict'> 

Dans le livre que je lis, l'auteur fait ceci:

>>> import feedparser 
>>> llog = feedparser.parse("http://languagelog.ldc.upenn.edu/nll/?feed=atom") 
>>> llog['feed']['title'] u'Language Log' 
>>> len(llog.entries) 15 
>>> post = llog.entries[2] 
>>> post.title u"He's My BF" 
>>> content = post.content[0].value 
>>> content[:70] u'<p>Today I was chatting with three of our visiting graduate students f' 
>>> nltk.word_tokenize(nltk.html_clean(content)) 

Et cela fonctionne pour moi sur une base entrée par entrée. Comme vous pouvez le voir, j'ai déjà un moyen de nettoyer le HTML en utilisant le NLTK. Mais ce que je veux vraiment, c'est récupérer toutes les entrées, les nettoyer du HTML (que je sais déjà comment faire et ne pas demander comment faire, lire la question un peu plus attentivement s'il vous plait), et les écrire dans un fichier chaîne de texte en clair. Ce qui a plus à voir avec l'utilisation de feedparser correctement. Y a-t-il un moyen simple de faire cela?

Mise à jour:

Je ne suis toujours pas plus près, il se trouve, de trouver un moyen facile de le faire. En raison de mon incompétence avec Python, j'ai été forcé de faire quelque chose d'un peu moche.

C'est ce que je pensais que je ferais:

import feedparser 
import nltk 

blog = feedparser.parse('myblog.xml') 

with open('myblog','w') as outfile: 
    for itemnumber in range(0, len(blog.entries)): 
     conts = blog.entries[itemnumber].content 
     cleanconts = nltk.word_tokenize(nltk.html_clean(conts)) 
     outfile.write(cleanconts) 

Alors, je vous remercie beaucoup, @Rob Cowie, mais votre version (qui ressemble beaucoup) ne fonctionne pas. Je me sens mal de ne pas l'avoir signalé plus tôt et d'avoir accepté la réponse, mais je n'ai pas beaucoup de temps pour travailler sur ce projet. Les choses que je mets ci-dessous sont tout ce que je pourrais obtenir pour travailler, mais je laisse cette question ouverte au cas où quelqu'un aurait quelque chose de plus élégant.

import feedparser 
import sys 

blog = feedparser.parse('myblog.xml') 
sys.stdout = open('blog','w') 

for itemnumber in range(0, len(blog.entries)): 
    print blog.entries[itemnumber].content 

sys.stdout.close() 

je CTRL-D'ed de l'interprète, parce que je ne savais pas comment fermer le fichier ouvert sans fermer la sortie standard de Python. Ensuite, j'ai ré-entré l'interprète, ouvert le fichier, lu le fichier, et nettoyé le HTML à partir de là. (nltk.html_clean est une faute de frappe dans la version en ligne du livre NLTK lui-même, en passant ... c'est en fait nltk.clean_html). Ce que j'ai fini avec était presque, mais pas tout à fait, en clair.

+0

duplication possible de [Extraction du texte du fichier HTML en utilisant Python] (http://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python) –

+0

@Sentinel Ce n'est pas un doublon. .. Ma question a plus à voir avec Feedparser. Je sais comment nettoyer le HTML, et j'ai déjà montré que je peux le faire. Je ne sais pas comment le faire sur chaque entrée avec Feedparser. – magnetar

Répondre

1
import feedparser 
llog = feedparser.parse("http://languagelog.ldc.upenn.edu/nll/?feed=atom") 

with open('myblog.txt', 'w') as outfile: 
    for entry in llog.entries: 
     ## Do your processing here 
     content = entry.content[0].value 
     clean_content = nltk.word_tokenize(nltk.html_clean(content)) 
     outfile.write(clean_content) 

, itérer les entrées (feed.entries), l'entrée processus selon les besoins et écrire la représentation appropriée au fichier.

Je ne fais aucune hypothèse sur la façon dont vous souhaitez délimiter le contenu de la publication dans le fichier texte. Cet extrait n'écrit pas non plus le titre du message, ni aucune métadonnée dans le fichier.

+0

Je crois que vous devez itérer sur les entrées en faisant quelque chose comme dans ce blog: http://frizzletech.blogspot.com/2011/02/how-i-created-my-weekly-feed-digest.html .. Vous ne pouvez pas écrire simplement post.content [0] ... – magnetar

+0

@magnetar; Vous avez repéré une erreur dans mon exemple. Je _am_ en boucle sur les entrées, mais en référence 'post' soulèverait un NameError. Copier/coller l'erreur je pense. –

Questions connexes