web-dev-qa-db-fra.com

Extraire des liens d'une page Web à l'aide de Go lang

J'apprends le langage de programmation Go de google . Est-ce que quelqu'un connaît la meilleure pratique pour extraire toutes les URL d'une page Web html?

Venant du monde Java, il existe des bibliothèques pour faire le travail, par exemple jsoup , htmlparser , etc.

23
Jifeng Zhang

Le package standard de Go pour l'analyse HTML est toujours un travail en cours et ne fait pas partie de la version actuelle. Un paquet tiers que vous pourriez essayer cependant est go-html-transform . Il est activement maintenu.

20
Sonia

Si vous connaissez jQuery, vous allez adorer GoQuery .

Honnêtement, c’est l’utilitaire HTML le plus simple et le plus puissant que j’ai trouvé dans Go, et il est basé sur le paquet HTML du référentiel go.net. (D'accord, il s'agit donc d'un logiciel de niveau supérieur au simple analyseur, car il n'expose pas les jetons HTML bruts, etc., mais si vous souhaitez réellement utiliser un document HTML, ce package vous aidera.)

23
Matt

Bien que le package Go pour l'analyse HTML soit toujours en cours, il est disponible dans le référentiel go.net

Ses sources sont à code.google.com/p/go.net/html github.com/golang/net et il est activement développé. 

Il en est fait mention dans cette récente discussion débile


Notez qu'avec Go 1.4 (décembre 2014), comme je l’ai mentionné dans cette réponse , le package est maintenant golang.org/x/net (voir godoc ).

17
VonC

J'ai cherché autour et trouvé qu'il existe une bibliothèque appelée Gokogiri qui ressemble à Nogokiri pour Ruby. Je pense que le projet est actif aussi.

6
Ye Lin Aung

Je viens de publier un package d'analyse syntaxique compatible Open Source Open Source basé sur HTML 5.0 pour Go. Vous pouvez le trouver ici

Voici l'exemple de code pour obtenir tous les liens d'une page (à partir d'éléments A):

links := make([]string)

parser := NewParser(htmlContent)

parser.Parse(nil, func(e *HtmlElement, isEmpty bool) {
    if e.TagName == "link" {
        link,_ := e.GetAttributeValue("href")
        if(link != "") {
            links = appends(links, link)
        } 
    }
}, nil)

Quelques points à garder à l'esprit:

  • Ce sont des liens relatifs, pas des URL complètes
  • Les liens générés dynamiquement ne seront pas collectés
  • D'autres liens ne sont pas collectés (balises META, images, iframes, etc.). Il est assez facile de modifier ce code pour les collecter.
0
Marcelo Calbucci