web-dev-qa-db-fra.com

Extraire le contenu d'un article de News à partir de pages .html stockées

Je lis du texte à partir de fichiers HTML et je fais des analyses. Ces fichiers .html sont des articles de presse. 

Code:

 html = open(filepath,'r').read()
 raw = nltk.clean_html(html)  
 raw.unidecode(item.decode('utf8'))

Maintenant, je veux juste le contenu de l'article et pas le reste du texte, comme des publicités, des en-têtes, etc. Comment puis-je le faire de manière relativement précise en python?

Je connais des outils comme Jsoup (une API Java) et bolier mais je veux le faire en python. Je pourrais trouver quelques techniques en utilisant bs4 mais limité à un type de page. Et j'ai des pages de nouvelles de nombreuses sources. En outre, il existe peu de modèles d’exemples de code.

Je cherche quelque chose comme ceci http://www.psl.cs.columbia.edu/wp-content/uploads/2011/03/3463-WWWJ.pdf en python.

EDIT: Pour mieux comprendre, écrivez un exemple de code afin d’extraire le contenu du lien suivant http://www.nytimes.com/2015/05/19/health/ étude trouve un tissu mammaire dense n'est pas toujours un risque de cancer élevé.html? src = me & ref = general

13
Abhishek Bhatia

Il existe aussi des bibliothèques pour cela en Python :) 

Puisque vous avez mentionné Java, il existe un wrapper Python pour boilerpipe qui vous permet de l'utiliser directement dans un script python: https://github.com/misja/python-boilerpipe

Si vous souhaitez utiliser uniquement des bibliothèques python, il existe 2 options:

https://github.com/buriy/python-readability

et

https://github.com/grangier/python-goose

Parmi les deux, je préfère Goose, mais sachez que les versions récentes de celui-ci ne parviennent parfois pas à extraire le texte pour une raison quelconque (ma recommandation est d'utiliser la version 1.0.22 pour le moment).

EDIT: voici un exemple de code utilisant Goose:

from goose import Goose
from requests import get

response = get('http://www.nytimes.com/2015/05/19/health/study-finds-dense-breast-tissue-isnt-always-a-high-cancer-risk.html?src=me&ref=general')
extractor = Goose()
article = extractor.extract(raw_html=response.content)
text = article.cleaned_text
9
oxymor0n

Journal devient de plus en plus populaire, je ne l'ai utilisé que superficiellement, mais ça a l'air bien. C'est Python 3 seulement.

Le quickstart ne montre que le chargement depuis une URL, mais vous pouvez charger depuis une chaîne HTML avec:

import newspaper

# LOAD HTML INTO STRING FROM FILE...

article = newspaper.Article('') # STRING REQUIRED AS `url` ARGUMENT BUT NOT USED
article.set_html(html)
9
Harry

Essayez quelque chose comme ceci en visitant la page directement: 

##Import modules
from bs4 import BeautifulSoup
import urllib2


##Grab the page
url = http://www.example.com
req = urllib2.Request(url)
page = urllib2.urlopen(req)
content = page.read()
page.close()  

##Prepare
soup = BeautifulSoup(content) 

##Parse (a table, for example)

for link in soup.find_all("table",{"class":"myClass"}):
    ...do something...
pass

Si vous souhaitez charger un fichier, remplacez simplement la partie où vous récupérez la page avec le fichier. En savoir plus ici: http://www.crummy.com/software/BeautifulSoup/bs4/doc/

1
datasci

Il existe de nombreuses façons d’organiser l’écrasement du langage HTML en Python. Comme indiqué dans d'autres réponses, l'outil n ° 1 est BeautifulSoup, mais il en existe d'autres:

Voici des ressources utiles:

Il n'y a pas de moyen universel de trouver le contenu de l'article. HTML5 a une balise d’article, faisant allusion au texte principal, et il est peut-être possible d’ajuster le grattage des pages de systèmes de publication spécifiques, mais il n’existe aucun moyen général d’obtenir l’emplacement du texte deviné avec précision. (Théoriquement, la machine peut déduire de la structure de la page de la recherche de plusieurs articles de contenu identique, mais leur contenu est probablement hors de portée.)

Aussi Web grattant avec Python peut être pertinent.

Exemple Pyquery pour NYT:

from pyquery import PyQuery as pq
url = 'http://www.nytimes.com/2015/05/19/health/study-finds-dense-breast-tissue-isnt-always-a-high-cancer-risk.html?src=me&ref=general'
d = pq(url=url)
text = d('.story-content').text()
1
Roman Susi

Vous pouvez utiliser htmllib ou HTMLParser vous pouvez les utiliser pour analyser votre fichier html

from HTMLParser import HTMLParser

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print "Encountered a start tag:", tag
    def handle_endtag(self, tag):
        print "Encountered an end tag :", tag
    def handle_data(self, data):
        print "Encountered some data  :", data

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

Un exemple de code extrait de la page HTMLParser

0
MaoKnight