Options de grattage HTML? [fermé]


406

Je pense à essayer Beautiful Soup , un package Python pour le scraping HTML. Existe-t-il d'autres packages de scraping HTML que je devrais consulter? Python n'est pas une exigence, je suis également intéressé à entendre parler d'autres langues.

L'histoire jusqu'ici:



Le lien Tag Soup est mort.
Tapper7

HtmlUnit est une implémentation complète du navigateur Java que vous ne pouvez pas disséquer en parties (vous ne pouvez pas télécharger juste une page html et la gratter, elle téléchargera tous les fichiers référencés, exécutera des scripts, etc.). En tant que tel, je ne pense pas qu'il appartienne ici.
Mark Jeronimus

Stock Java peut parcourir le HTML avec des expressions XPath, mais pas sans problèmes. La partie analyseur (DocumentBuilder) s'étouffe avec un code HTML incorrect, et un code HTML 100% correct est en fait assez rare sur le Web. Par conséquent, j'aime remplacer l'analyseur par JTidy . Quant à XPath, Java XPathExpressionpeut être utilisé (qui existe depuis Java 1.5)
Mark Jeronimus

Réponses:



44

Dans le monde .NET, je recommande le pack d'agilité HTML. Pas aussi simple que certaines des options ci-dessus (comme HTMLSQL), mais c'est très flexible. Il vous permet de manipuler du HTML mal formé comme s'il s'agissait d'un XML bien formé, vous pouvez donc utiliser XPATH ou simplement répéter sur des nœuds.

http://www.codeplex.com/htmlagilitypack


2
combinez linq avec lui et ça ressemble plus à HTMLSQL, non?
Bénissez Yahu

3
Combinez SharpQuery avec lui, et cela ressemble à jQuery! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack ne parvient pas à structurer correctement le DOM pour un certain nombre de documents HTML que j'ai essayés.
Ash Berlin-Taylor

37

BeautifulSoup est un excellent moyen d'aller pour le grattage HTML. Mon travail précédent m'avait fait faire beaucoup de grattage et j'aurais aimé connaître BeautifulSoup quand j'ai commencé. C'est comme le DOM avec beaucoup d'options plus utiles et beaucoup plus pythonique. Si vous voulez essayer Ruby, ils ont porté BeautifulSoup en l'appelant RubyfulSoup mais il n'a pas été mis à jour depuis longtemps.

D'autres outils utiles sont HTMLParser ou sgmllib.SGMLParser qui font partie de la bibliothèque Python standard. Ceux-ci fonctionnent en appelant des méthodes chaque fois que vous entrez / quittez une balise et rencontrez du texte html. Ils sont comme des expatriés si vous connaissez cela. Ces bibliothèques sont particulièrement utiles si vous allez analyser de très gros fichiers et que la création d'une arborescence DOM serait longue et coûteuse.

Les expressions régulières ne sont pas très nécessaires. BeautifulSoup gère les expressions régulières, donc si vous avez besoin de leur puissance, vous pouvez l'utiliser là-bas. Je dis aller avec BeautifulSoup, sauf si vous avez besoin de vitesse et d'une plus petite empreinte mémoire. Si vous trouvez un meilleur analyseur HTML sur Python, faites le moi savoir.


21

J'ai trouvé que HTMLSQL était un moyen ridiculement simple de faire des captures d'écran. Cela prend littéralement quelques minutes pour obtenir des résultats avec.

Les requêtes sont super intuitives - comme:

SELECT title from img WHERE $class == 'userpic'

Il existe maintenant d'autres alternatives qui adoptent la même approche.


7
Pour info, ceci est une bibliothèque PHP
Tristan Havelick

19

La bibliothèque Python lxml agit comme une liaison Pythonic pour les bibliothèques libxml2 et libxslt. J'aime particulièrement son support XPath et la jolie impression de la structure XML en mémoire. Il prend également en charge l'analyse du code HTML cassé. Et je ne pense pas que vous puissiez trouver d'autres bibliothèques / liaisons Python qui analysent XML plus rapidement que lxml.



16

Python a plusieurs options pour le grattage HTML en plus de Beatiful Soup. En voici d'autres:

  • mécaniser : similaire à perl WWW:Mechanize. Vous donne un objet semblable à un navigateur pour interagir avec les pages Web
  • lxml : liaison Python à libwww. Prend en charge diverses options pour parcourir et sélectionner des éléments (par exemple , sélection XPath et CSS)
  • scrapemark : bibliothèque de haut niveau utilisant des modèles pour extraire des informations du HTML.
  • pyquery : permet de faire des requêtes jQuery sur des documents XML.
  • scrapy : un framework de grattage et d'exploration Web de haut niveau. Il peut être utilisé pour écrire des araignées, pour l'exploration de données et pour la surveillance et les tests automatisés

1
La bibliothèque standard Python possède un analyseur HTML intégré ... pourquoi ne pas simplement l'utiliser? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

L' utilitaire templatemaker d'Adrian Holovaty (de la renommée Django ) utilise une approche très intéressante: vous lui donnez des variations de la même page et il "apprend" où se trouvent les "trous" pour les données variables. Ce n'est pas spécifique au HTML, donc ce serait bien pour gratter tout autre contenu en texte brut également. Je l'ai également utilisé pour les fichiers PDF et HTML convertis en texte brut (avec pdftotext et lynx, respectivement).


comment avez-vous fait travailler templatemaker pour de grandes pages HTML? Je l'ai trouvé se bloque lorsque je lui donne quelque chose de non trivial.
hoju

Je suppose que je n'ai pas eu de grandes pages HTML. Aucun problème enregistré ne semble exister pour ce problème sur code.google.com/p/templatemaker/issues/list , il est donc probablement approprié d'y envoyer un cas de test. Cependant, il ne semble pas qu'Adrian gère la bibliothèque. Je me demande ce qu'il utilise de nos jours chez EveryBlock car ils font sûrement beaucoup de grattage.
akaihola

10

Je connais et j'aime Screen-Scraper .

Screen-Scraper est un outil pour extraire des données de sites Web. Screen-Scraper automatise:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

Utilisations courantes:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

Technique:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

Trois éditions de grattoir d'écran:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.

Malheureusement, même la version de base n'est pas FOSS. Il semble que ce soit gratuit comme dans la bière.
Andreas Kuckartz

9

Je voudrais d'abord savoir si le ou les sites en question fournissent un serveur API ou des flux RSS pour accéder aux données dont vous avez besoin.


8

Le débordement de la pile de grattage est particulièrement facile avec les chaussures et Hpricot .

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end

8

Une autre option pour Perl serait Web :: Scraper qui est basé sur Ruby's Scrapi . En bref, avec une syntaxe agréable et concise, vous pouvez obtenir un grattoir robuste directement dans les structures de données.


7

J'ai eu un certain succès avec HtmlUnit , en Java. C'est un cadre simple pour écrire des tests unitaires sur les interfaces utilisateur Web, mais également utile pour le scraping HTML.


vous pouvez également l'utiliser pour évaluer l'exécution de javascript si vous en avez besoin :)
David




5

J'utilise Hpricot sur Ruby. À titre d'exemple, il s'agit d'un extrait de code que j'utilise pour récupérer tous les titres de livres des six pages de mon compte HireThings (car ils ne semblent pas fournir une seule page avec ces informations):

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

C'est à peu près complet. Tout ce qui précède les importations de bibliothèque et les paramètres de mon proxy.


5

J'ai beaucoup utilisé Beautiful Soup avec Python. C'est beaucoup mieux que la vérification des expressions régulières, car cela fonctionne comme l'utilisation du DOM , même si le HTML est mal formaté. Vous pouvez trouver rapidement des balises HTML et du texte avec une syntaxe plus simple que les expressions régulières. Une fois que vous avez trouvé un élément, vous pouvez effectuer une itération sur lui et ses enfants, ce qui est plus utile pour comprendre le contenu du code que pour les expressions régulières. Je souhaite que Beautiful Soup existe il y a des années quand je devais faire beaucoup de captures d'écran - cela m'aurait fait gagner beaucoup de temps et de maux de tête car la structure HTML était si pauvre avant que les gens ne commencent à la valider.


5

Bien qu'il ait été conçu pour les tests Web .NET , j'ai utilisé le framework WatiN à cette fin. Comme il est basé sur DOM, il est assez facile de capturer du HTML, du texte ou des images. Récemment, je l'ai utilisé pour transférer une liste de liens d'une requête d'espace de noms MediaWiki Toutes les pages dans une feuille de calcul Excel. La gestion du code VB.NET suivante est assez grossière, mais cela fonctionne.


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub


3

Vous seriez fou de ne pas utiliser Perl .. Voici venir les flammes ..

Oser sur les modules suivants et ginsu toute égratignure autour.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

3

J'ai utilisé LWP et HTML :: TreeBuilder avec Perl et les ai trouvés très utiles.

LWP (abréviation de libwww-perl) vous permet de vous connecter à des sites Web et de gratter le HTML, vous pouvez obtenir le module ici et le livre O'Reilly semble être en ligne ici .

TreeBuilder vous permet de construire une arborescence à partir du HTML, et la documentation et la source sont disponibles dans HTML :: TreeBuilder - Analyseur qui construit une arborescence de syntaxe HTML .

Cependant, il pourrait y avoir trop de travail lourd à faire avec quelque chose comme cette approche. Je n'ai pas regardé le module Mechanize suggéré par une autre réponse, donc je peux très bien le faire.



3

Eh bien, si vous voulez le faire du côté client en utilisant uniquement un navigateur, vous avez jcrawl.com . Après avoir conçu votre service de mise au rebut à partir de l'application Web ( http://www.jcrawl.com/app.html ), il vous suffit d'ajouter le script généré à une page HTML pour commencer à utiliser / présenter vos données.

Toute la logique de mise au rebut se produit sur le navigateur via JavaScript. J'espère que tu trouves cela utile. Cliquez sur ce lien pour un exemple en direct qui extrait les dernières nouvelles de Yahoo tennis .


2

Vous en avez probablement déjà autant, mais je pense que c'est ce que vous essayez de faire:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")


2

J'aime la fonction ImportXML (URL, XPath) de Google Spreadsheets.

Il répétera les cellules dans la colonne si votre expression XPath renvoie plus d'une valeur.

Vous pouvez avoir jusqu'à 50 importxml() fonctions sur une seule feuille de calcul.

Le plugin Web de RapidMiner est également assez facile à utiliser. Il peut publier des messages, accepter les cookies et définir l' agent utilisateur .


2

J'ai également eu beaucoup de succès en utilisant Jaxer + jQuery d'Aptana pour analyser des pages. Ce n'est pas aussi rapide ou de type script, mais les sélecteurs jQuery + JavaScript / DOM réel sont une bouée de sauvetage sur des pages plus compliquées (ou mal formées).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.