Construire votre premier grattoir Web, première partie

Rubyland a deux joyaux qui occupent le Web depuis deux ans: Nokogiri et Mechanize. Nous passons un article sur chacun d’eux avant de les mettre en pratique avec un exemple pratique.

Les sujets

  • Web Scraping?
  • Autorisation
  • Le problème
  • Nokogiri
  • Extraction?
  • Des pages
  • API
  • Navigation de nœud

Web Scraping?

Il existe des termes plus sophistiqués que le Web ou le grattage d’écran. La collecte sur le Web et l'extraction de données sur le Web vous disent assez rapidement ce qui se passe. Nous pouvons automatiser l'extraction de données à partir de pages Web - et ce n'est pas si compliqué aussi. 

D'une certaine manière, ces outils vous permettent d'imiter et d'automatiser la navigation Web humaine. Vous écrivez un programme qui extrait uniquement le type de données qui vous intéresse. Le ciblage de données spécifiques est presque aussi simple que d'utiliser des sélecteurs CSS.

Il y a quelques années, je me suis inscrit à un cours vidéo en ligne comportant un million de vidéos courtes, mais aucune option pour les télécharger en masse. Je devais parcourir chaque lien par moi-même et faire moi-même le «sauver comme» tant redouté. C'était en quelque sorte une toile humaine, une tâche que nous devons souvent faire lorsque nous manquons de connaissances pour automatiser ce genre de choses. Le cours lui-même était correct, mais je n'ai plus utilisé leurs services par la suite. C'était trop fastidieux. 

Aujourd'hui, je me moque bien de cette expérience UX qui fait fondre l'esprit. Un racleur qui effectuerait le téléchargement pour moi ne me prendrait que quelques minutes à lancer ensemble. Pas trop grave!

Laissez-moi décomposer très vite avant de commencer. Le tout peut être condensé en quelques étapes. Nous cherchons d’abord une page Web contenant les données souhaitées. Ensuite, nous parcourons cette page et identifions les informations que nous souhaitons extraire.. 

La dernière étape consiste à cibler ces bits, les découper si nécessaire et décider comment et où vous souhaitez les stocker. Un langage HTML bien écrit est souvent essentiel pour rendre ce processus facile et agréable. Pour les extractions plus complexes, il peut être pénible de devoir gérer un balisage mal structuré..

Qu'en est-il des API? Très bonne question. Si vous avez accès à un service avec une API, il n'est souvent pas nécessaire d'écrire votre propre grattoir. Cette approche s’adresse principalement aux sites Web qui n’offrent pas ce type de commodité. Sans une API, c'est souvent le seul moyen d'automatiser l'extraction des informations des sites Web.. 

Vous vous demandez peut-être comment cette opération de grattage fonctionne réellement? Sans entrer dans les détails, la réponse est simple, en traversant des structures de données arborescentes. Nokogiri construit ces structures de données à partir des documents que vous alimentez et vous permet de cibler des éléments d’intérêt pour l’extraction. Par exemple, CSS est un langage écrit pour la traversée d’arbres, pour la recherche de structures de données d’arbres, et nous pouvons l’utiliser pour l’extraction de données..

Il existe de nombreuses approches et solutions pour jouer avec. Rubyland possède deux joyaux qui occupent une place de choix depuis plusieurs années. De nombreuses personnes ont encore recours à Nokogiri et à Mechanize pour répondre aux besoins de suppression de HTML. Les deux ont été testés et se sont avérés être faciles à utiliser tout en étant très capable. Nous allons regarder les deux. Mais avant cela, je voudrais prendre un moment pour aborder le problème que nous allons résoudre à la fin de cette courte série introductive..

Autorisation

Avant de commencer à gratter, assurez-vous d'avoir l'autorisation des sites auxquels vous essayez d'accéder pour l'extraction de données. Si le site dispose d'une API ou d'un flux RSS, par exemple, il pourrait être non seulement plus facile d'obtenir le contenu souhaité, cela pourrait également être l'option légale de choix. 

Tout le monde ne l'appréciera pas si vous faites des mises à jour massives sur leurs sites, ce qui est compréhensible. Faites-vous éduquer sur le site qui vous intéresse, et ne vous attachez pas à des ennuis. Il y a peu de chances que vous causiez de gros dégâts, mais risquer des ennuis sans le savoir n'est pas la solution..

Le problème

Je devais construire un nouveau podcast. Le design n'était pas ce que je voulais, et je détestais la façon de publier de nouveaux articles. Zut WYSIWYG! Un peu de contexte. Il y a environ deux ans, j'ai construit la première version de mon podcast. L'idée était de jouer avec Sinatra et de construire quelque chose de super léger. J'ai rencontré quelques problèmes inattendus, car j'ai presque tout fait sur mesure. 

Venant de Rails, c’est vraiment un parcours éducatif que j’apprécie, mais j’ai vite regretté de ne pas avoir utilisé un site statique que j’aurais pu déployer via GitHub via les pages GitHub. Le déploiement de nouveaux épisodes et leur maintien manquaient de la simplicité que je recherchais. Pendant un moment, j'ai décidé que j'avais un poisson plus gros à frire et je me suis concentré à produire du nouveau matériel de podcast.

L'été dernier, j'ai commencé à être sérieux et j'ai travaillé sur un site Middleman hébergé via des pages GitHub. Pour la deuxième saison du spectacle, je voulais quelque chose de frais. Un nouveau design simplifié, Markdown pour la publication de nouveaux épisodes, et aucun combat à mains nues avec Heroku-heaven! Le problème, c’était que j'avais 139 épisodes qui devaient être importés et convertis d’abord pour pouvoir travailler avec Middleman.. 

Middleman utilise pour les messages .réduction fichiers qui ont ce qu'on appelle frontmatter pour les données qui remplace ma base de données essentiellement. Ce transfert manuel n’est pas une option pour 139 épisodes. C'est à quoi sert le calcul. Je devais trouver un moyen d'analyser le code HTML de mon ancien site Web, de balayer le contenu pertinent et de le transférer vers les articles de blog que j'utilise pour publier de nouveaux épisodes de podcast sur Middleman.. 

Par conséquent, au cours des trois prochains articles, je vais vous présenter les outils couramment utilisés en Rubyland pour ces tâches. En fin de compte, nous allons passer en revue ma solution pour vous montrer quelque chose de concret aussi.

Nokogiri

Même si vous êtes complètement nouveau dans Ruby / Rails, il est fort probable que vous ayez déjà entendu parler de ce petit bijou. Le nom est souvent oublié et reste avec vous facilement. Je ne suis pas sûr que beaucoup sachent que nokogiri est japonais pour «vu». 

C'est un nom approprié une fois que vous avez compris le rôle de l'outil. Le créateur de ce joyau est la belle Tenderlove, Aaron Patterson. Nokogiri convertit les documents XML et HTML en une structure de données - une structure de données arborescente, pour être plus précis. L'outil est rapide et offre également une belle interface. Dans l’ensemble, il s’agit d’une bibliothèque très puissante qui répond à une multitude de besoins de suppression de HTML..

Vous pouvez utiliser Nokogiri non seulement pour analyser le code HTML; XML est un jeu juste aussi. Il vous donne les options du langage de chemin XML et des interfaces CSS pour parcourir les documents que vous chargez. Le chemin XML Language, ou XPath en abrégé, est un langage de requête. 

Cela nous permet de sélectionner des nœuds à partir de documents XML. Les sélecteurs CSS sont probablement plus familiers aux débutants. Comme pour les styles que vous écrivez, les sélecteurs CSS permettent de cibler des sections spécifiques de pages présentant un intérêt particulier pour l'extraction. Il vous suffit de faire savoir à Nokogiri ce que vous cherchez lorsque vous ciblez une destination particulière..

Des pages

Nous devons toujours commencer par aller chercher la page qui nous intéresse. Nous spécifions quel type de document Nokogiri nous voulons analyser en XML ou HTML, par exemple:

Nokogiri :: XML Nokogiri :: HTML

some_scraper.rb

nécessite "nokogiri" nécessite "open-uri" page = Nokogiri :: XML (File.open ("some.xml")) page = Nokogiri :: HTML (File.open ("some.html"))

Nokogiri: XML et Nokogiri: HTML peut prendre des objets IO ou des objets String. Ce qui se passe ci-dessus est simple. Cela ouvre et récupère la page désignée en utilisant open-uri puis charge sa structure, son XML ou HTML dans un nouveau document Nokogiri. XML n'est pas une chose à laquelle les débutants doivent souvent faire face. 

Par conséquent, je recommanderais que nous nous concentrions sur l'analyse HTML pour l'instant. Pourquoi open-uri? Ce module de la bibliothèque Ruby Standard Library nous permet d’accéder au site sans difficulté. Parce que les objets IO sont un jeu équitable, nous pouvons utiliser facilement open-uri.

API

Mettons cela en pratique avec un mini exemple:

at_css

some_podcast_scraper.rb

require 'nokogiri' require 'open-uri "url =' http://betweenscreens.fm/ '= page = Nokogiri :: HTML (open (url)) en-tête = page.at_css (" h2.post-title ") title = header.text met "Ceci est l'en-tête brut du dernier épisode: # header" met "Ceci est le titre du dernier épisode: # titre"

Ce que nous avons fait ici représente toutes les étapes habituellement impliquées dans le raclage Web - à un niveau micro-économique réduit. Nous décidons de l'URL dont nous avons besoin et du site que nous devons extraire, puis nous les chargeons dans un nouveau document Nokogiri. Ensuite, nous ouvrons cette page et ciblons une section spécifique.

Ici, je voulais seulement connaître le titre du dernier épisode. En utilisant le at_css méthode et un sélecteur CSS pour h2.post-title était tout ce dont j'avais besoin pour cibler le point d'extraction. Avec cette méthode, nous ne ferons que gratter cet élément singulier. Cela nous donne l’ensemble du sélecteur - ce qui n’est généralement pas exactement ce dont nous avons besoin. Par conséquent, nous n’extrayons que la partie texte interne de ce nœud via le texte méthode. À titre de comparaison, vous pouvez vérifier la sortie pour l'en-tête et le texte ci-dessous..

Sortie

C'est le titre brut du dernier épisode: 

David Heinemeier Hansson

C'est le titre du dernier épisode: David Heinemeier Hansson

Bien que cet exemple ait des applications très limitées, il possède tous les ingrédients, toutes les étapes que vous devez comprendre. Je pense que c'est cool comme c'est simple. Parce que cet exemple n’a peut-être pas été évident, je voudrais souligner toute la puissance de cet outil. Voyons ce que nous pouvons faire d'autre avec un script Nokogiri.

Attention!

Si vous êtes débutant et que vous ne savez pas comment cibler le code HTML nécessaire, je vous recommande de rechercher en ligne pour savoir comment inspecter le contenu des sites Web dans votre navigateur. En gros, tous les principaux navigateurs rendent ce processus très facile de nos jours. 

Sur Chrome, il vous suffit de cliquer avec le bouton droit de la souris sur un élément du site Web et de choisir l'option d'inspection. Cela ouvrira une petite fenêtre au bas de votre navigateur qui vous montrera quelque chose qui ressemble à une radiographie du DOM du site. Il propose de nombreuses autres options et je vous conseillerais de consacrer un peu de temps à Google pour vous informer. C'est du temps passé à bon escient!

css

le css méthode nous donnera non seulement un seul élément de choix mais tout élément correspondant aux critères de recherche de la page. Assez soigné et simple!

some_scraper.rb

require 'nokogiri' require 'open-uri "url =' http://betweenscreens.fm/ '= page = Nokogiri :: HTML (open (url)) en-têtes = page.css (" h2.post-title ") en-têtes. chacun fait | header | met "Ceci est le titre brut du dernier épisode: # en-tête" end headers.each do | header | met "Ceci est le titre du dernier épisode: # header.text" fin

Sortie

C'est le titre brut du dernier épisode: 

David Heinemeier Hansson

C'est le titre brut du dernier épisode:

Zach Holman

C'est le titre brut du dernier épisode:

Joel Glovier

C'est le titre brut du dernier épisode:

João Ferreira

C'est le titre brut du dernier épisode:

Corwin Harrell

C'est le titre brut du dernier épisode:

Roberto Machado

C'est le titre brut du dernier épisode:

James Edward Gray II

Ceci est le titre du dernier épisode: David Heinemeier Hansson Ceci est le titre du dernier épisode: Zach Holman Ceci est le titre du dernier épisode: Joel Glovier Ceci est le titre du dernier épisode: João Ferreira Ceci est le titre de le dernier épisode: Corwin Harrell Ceci est le titre du dernier épisode: Roberto Machado Ceci est le titre du dernier épisode: James Edward Gray II

La seule petite différence dans cet exemple est que j'itère d'abord les en-têtes bruts. J'ai aussi extrait son texte intérieur avec le texte méthode. Nokogiri s'arrête automatiquement à la fin de la page et n'essaie pas de suivre la pagination nulle part ailleurs.

Disons que nous voulons avoir un peu plus d'informations, disons la date et le sous-titre de chaque épisode. Nous pouvons simplement développer l'exemple ci-dessus. C'est quand même une bonne idée de procéder étape par étape. Faites fonctionner un petit morceau et ajoutez de la complexité en cours de route.

some_scraper.rb

require 'nokogiri' require 'open-uri "url =' http://betweenscreens.fm/ '= page = Nokogiri :: HTML (open (url)) articles = page.css (" article.index-article "). chacun fait | article | header = article.at_css ("h2.post-title") date = article.at_css (". post-date") subtit = article.at_css (". topic-list") met "Ceci est l'en-tête brut: #  header "met" Ceci est la date brute: # date "met" Ceci est le sous-titre brut: # sous-titre \ n \ n "met" Ceci est l'en-tête de texte: # header.text "met" Ceci est le texte date: # date.text "met" Ceci est le sous-titre du texte: # subtitle.text \ n \ n "fin

Sortie

C'est l'en-tête brut: 

David Heinemeier Hansson

C'est la date brute: 18 octobre | 2016 Voici le sous-titre brut:

Communauté Rails | Ton | Désaccords techniques | Police de proximité | Ingratitude | Aucun trou du cul autorisé | Camp de base | Personnage Open Source | Aspirations | Garder les motivations | Traiter avec le public | Pression | L'honnêteté | Divers avis | Banalités

Ceci est l'en-tête de texte: David Heinemeier Hansson Date du texte: 18 octobre | 2016 Ceci est le sous-titre du texte: Communauté Rails | Ton | Désaccords techniques | Police de proximité | Ingratitude | Aucun trou du cul autorisé | Camp de base | Personnage Open Source | Aspirations | Garder les motivations | Traiter avec le public | Pression | L'honnêteté | Divers avis | Small Talk C'est l'en-tête brut:

Zach Holman

C'est la date brute: 12 octobre | 2016 Voici le sous-titre brut:

Se faire virer | Tabou | La transparence | Différentes perspectives | Calendrier | Stades de croissance | Emploi & Rencontres | Gestionnaires | Emploi à volonté | Industrie de la technologie | Europe | Fruits à suspendre | Plans d'amélioration des performances | Atteindre les objectifs | Feux surprise | Tir rapide | Les erreurs | Culture d'entreprise | la communication

Ceci est l'en-tête de texte: Zach Holman Ceci est la date du texte: Oct 12 | 2016 Ceci est le sous-titre du texte: Se faire virer | Tabou | La transparence | Différentes perspectives | Calendrier | Stades de croissance | Emploi & Rencontres | Gestionnaires | Emploi à volonté | Industrie de la technologie | Europe | Fruits à suspendre | Plans d'amélioration des performances | Atteindre les objectifs | Feux surprise | Tir rapide | Les erreurs | Culture d'entreprise | Communication C'est l'en-tête brut:

Joel Glovier

C'est la date brute: 10 octobre | 2016 Voici le sous-titre brut:

Conception de produits numériques | Produit Design @ GitHub | Conception affectueuse | Ordre & Chaos | Dessin | Web Design | HospitalRun | La diversité | Culture de démarrage | Améliorer des vies | CURE International | Ember | Hors ligne d'abord | Système d'information hospitalier | Designers et Open Source

Ceci est l'en-tête de texte: Joel Glovier Ceci est la date du texte: Oct 10 | 2016 Ceci est le sous-titre du texte: Conception de produits numériques | Produit Design @ GitHub | Conception affectueuse | Ordre & Chaos | Dessin | Web Design | HospitalRun | La diversité | Culture de démarrage | Améliorer des vies | CURE International | Ember | Hors ligne d'abord | Système d'information hospitalier | Designers & Open Source C'est l'en-tête brut:

João Ferreira

C'est la date brute: 26 août | 2015 Voici le sous-titre brut:

Masters @ Work | Subvisual | Délais | Personnalité du design | Problèmes de conception | Équipe | Envoi d'enveloppes | Expériences délicieuses | Perfectionner les détails | Valeurs de l'entreprise

Ceci est l'en-tête de texte: João Ferreira Date du texte: 26 août | 2015 Ceci est le sous-titre du texte: Masters @ Work | Subvisual | Délais | Personnalité du design | Problèmes de conception | Équipe | Envoi d'enveloppes | Expériences délicieuses | Perfectionner les détails | Valeurs de l'entreprise Il s'agit de l'en-tête brut:

Corwin Harrell

C'est la date brute: Août 06 | 2015 Voici le sous-titre brut:

Q & A | 01 | Université | Conception graphique | Configuration de la conception | Sublime | Atome | thinkbot | Lieu de travail | Collaboration et appariement | Vim avocats | Routine quotidienne | Standups | Les clients | Promenades de café | Vendredis d'investissement |

Ceci est l'en-tête de texte: Corwin Harrell Ceci est la date du texte: Août 06 | 2015 Ceci est le sous-titre du texte: Q & A | 01 | Université | Conception graphique | Configuration de la conception | Sublime | Atome | thinkbot | Lieu de travail | Collaboration et appariement | Vim avocats | Routine quotidienne | Standups | Les clients | Promenades de café | Vendredis d'investissement | C'est l'en-tête brut:

Roberto Machado

C'est la date brute: Août 03 | 2015 Voici le sous-titre brut:

PDG @ Subvisual | RubyConf Portugal | Ecole de créateurs | Conseil | Modèles de société | Amis du groupe | Startup portugaise | Rebranding | Technologies utilisées | Cadres JS | TDD & BDD | Erreurs de démarrage | Culture d'apprentissage | Jeunes entrepreneurs

Ceci est l'en-tête de texte: Roberto Machado Ceci est la date du texte: 03 août | 2015 Ceci est le sous-titre du texte: CEO @ Subvisual | RubyConf Portugal | Ecole de créateurs | Conseil | Modèles de société | Amis du groupe | Startup portugaise | Rebranding | Technologies utilisées | Cadres JS | TDD & BDD | Erreurs de démarrage | Culture d'apprentissage | Jeunes entrepreneurs Voici l'en-tête brut:

James Edward Gray II

C'est la date brute: 30 juillet | 2015 Voici le sous-titre brut:

Screencasting | Moins de code | Lecture du code | Se décoller | La base de code de Rails | CodeNewbie | Petits exemples | Plans futurs | PeepCode | Fréquence et tarification

Ceci est l'en-tête de texte: James Edward Gray II Ceci est la date du texte: 30 juillet | 2015 Ceci est le sous-titre du texte: Screencasting | Moins de code | Lecture du code | Se décoller | La base de code de Rails | CodeNewbie | Petits exemples | Plans futurs | PeepCode | Fréquence et tarification

À ce stade, nous avons déjà quelques données à jouer. Nous pouvons le structurer ou le dépecer comme bon nous semble. Ce qui précède devrait simplement montrer ce que nous avons de manière lisible. Bien sûr, nous pouvons approfondir chacune d’elles en utilisant des expressions régulières avec le texte méthode. 

Nous examinerons cette question de manière beaucoup plus détaillée lorsque nous parviendrons à résoudre le problème du podcast. Ce ne sera pas un cours d’expression rationnelle, mais vous en verrez un peu plus en action, mais pas de soucis, pas même au point de faire saigner votre cerveau..

Les attributs

Ce qui pourrait être pratique à ce stade est d’extraire le href pour les épisodes individuels aussi. Ça ne pourrait pas être plus simple.

some_scraper.rb

require 'nokogiri' require 'open-uri "url =' http://betweenscreens.fm/ '= page = Nokogiri :: HTML (open (url)) articles = page.css (" article.index-article "). chacun fait | article | header = article.at_css ("h2.post-title") date = article.at_css (". post-date") subtit = article.at_css (". topic-list") link = article.at_css ("h2.post -title a ") podcast_url =" http://betweenscreens.fm/ "met" Ceci est l'en-tête brut: # header "met" Ceci est la date brute: # date "met" Ceci est le sous-titre brut : # sous-titre "met" Ceci est le lien brut: # link \ n \ n "met" Ceci est l'en-tête de texte: # header.text "met" Ceci est la date du texte: # date. text "met" Ceci est le sous-titre du texte: # subtitle.text "met" Ceci est le lien brut: # podcast_url # link [: href] \ n \ n "fin

Les éléments les plus importants à surveiller sont les suivants: [: href] et podcast_url. Si vous taguez sur [:] vous pouvez simplement extraire un attribut du sélecteur ciblé. J'ai résumé un peu plus loin, mais vous pouvez voir plus clairement comment ça marche ci-dessous.

… Href = article.at_css ("h2.post-title a") [: href]… 

Pour obtenir une URL complète et utile, j'ai sauvegardé le domaine racine dans une variable et construit l'URL complète pour chaque épisode..

… Podcast_url = "http://betweenscreens.fm/" met "Ceci est le lien brut: # podcast_url # link [: href] \ n \ n"… 

Jetons un coup d'œil à la sortie:

Sortie

C'est l'en-tête brut: 

Jason Long

C'est la date brute: 25 octobre | 2016 Voici le sous-titre brut:

Open source | Empathie | Barrières basses | Outil d'apprentissage | Contributions à la conception | Site web Git | Marque | GitHub | Neovim | Tmux | Design love | Connaître le public | Montrant le travail | Dribbble | Progressions | Des idées

Ceci est le lien brut: Jason Long Ceci est l'en-tête de texte: Jason Long Ceci est la date du texte: 25 octobre | 2016 Ceci est le sous-titre du texte: Open source | Empathie | Barrières basses | Outil d'apprentissage | Contributions à la conception | Site web Git | Marque | GitHub | Neovim | Tmux | Design love | Connaître le public | Montrant le travail | Dribbble | Progressions | Idées C'est le href: http://betweenscreens.fm/episodes/143/ Ceci est l'en-tête brut:

David Heinemeier Hansson

C'est la date brute: 18 octobre | 2016 Voici le sous-titre brut:

Communauté Rails | Ton | Désaccords techniques | Police de proximité | Ingratitude | Aucun trou du cul autorisé | Camp de base | Personnage Open Source | Aspirations | Garder les motivations | Traiter avec le public | Pression | L'honnêteté | Divers avis | Banalités

Ceci est le lien brut: David Heinemeier Hansson Ceci est l'en-tête de texte: David Heinemeier Hansson Ceci est la date du texte: Oct 18 | 2016 Ceci est le sous-titre du texte: Communauté Rails | Ton | Désaccords techniques | Police de proximité | Ingratitude | Aucun trou du cul autorisé | Camp de base | Personnage Open Source | Aspirations | Garder les motivations | Traiter avec le public | Pression | L'honnêteté | Divers avis | Small Talk C'est le href: http://betweenscreens.fm/episodes/142/ Ceci est l'en-tête brut:

Zach Holman

C'est la date brute: 12 octobre | 2016 Voici le sous-titre brut:

Se faire virer | Tabou | La transparence | Différentes perspectives | Calendrier | Stades de croissance | Emploi & Rencontres | Gestionnaires | Emploi à volonté | Industrie de la technologie | Europe | Fruits à suspendre | Plans d'amélioration des performances | Atteindre les objectifs | Feux surprise | Tir rapide | Les erreurs | Culture d'entreprise | la communication

Ceci est le lien brut: Zach Holman Ceci est l'en-tête de texte: Zach Holman Ceci est la date du texte: Oct 12 | 2016 Ceci est le sous-titre du texte: Se faire virer | Tabou | La transparence | Différentes perspectives | Calendrier | Stades de croissance | Emploi & Rencontres | Gestionnaires | Emploi à volonté | Industrie de la technologie | Europe | Fruits à suspendre | Plans d'amélioration des performances | Atteindre les objectifs | Feux surprise | Tir rapide | Les erreurs | Culture d'entreprise | Communication Ceci est le href: http://betweenscreens.fm/episodes/141/ Ceci est l'en-tête brut:

Joel Glovier

C'est la date brute: 10 octobre | 2016 Voici le sous-titre brut:

Conception de produits numériques | Produit Design @ GitHub | Conception affectueuse | Ordre & Chaos | Dessin | Web Design | HospitalRun | La diversité | Culture de démarrage | Améliorer des vies | CURE International | Ember | Hors ligne d'abord | Système d'information hospitalier | Designers et Open Source

Ceci est le lien brut: Joel Glovier Ceci est l'en-tête de texte: Joel Glovier Ceci est la date du texte: Oct 10 | 2016 Ceci est le sous-titre du texte: Conception de produits numériques | Produit Design @ GitHub | Conception affectueuse | Ordre & Chaos | Dessin | Web Design | HospitalRun | La diversité | Culture de démarrage | Améliorer des vies | CURE International | Ember | Hors ligne d'abord | Système d'information hospitalier | Designers & Open Source Ceci est le href: http://betweenscreens.fm/episodes/140/ Ceci est l'en-tête brut:

João Ferreira

C'est la date brute: 26 août | 2015 Voici le sous-titre brut:

Masters @ Work | Subvisual | Délais | Personnalité du design | Problèmes de conception | Équipe | Envoi d'enveloppes | Expériences délicieuses | Perfectionner les détails | Valeurs de l'entreprise

Ceci est le lien brut: João Ferreira Ceci est l'en-tête de texte: João Ferreira Date du texte: 26 août | 2015 Ceci est le sous-titre du texte: Masters @ Work | Subvisual | Délais | Personnalité du design | Problèmes de conception | Équipe | Envoi d'enveloppes | Expériences délicieuses | Perfectionner les détails | Valeurs de l'entreprise Voici le href: http://betweenscreens.fm/episodes/139/ Ceci est l'en-tête brut:

Corwin Harrell

C'est la date brute: Août 06 | 2015 Voici le sous-titre brut:

Q & A | 01 | Université | Conception graphique | Configuration de la conception | Sublime | Atome | thinkbot | Lieu de travail | Collaboration et appariement | Vim avocats | Routine quotidienne | Standups | Les clients | Promenades de café | Vendredis d'investissement |

Ceci est le lien brut: Corwin Harrell Ceci est l'en-tête de texte: Corwin Harrell Ceci est la date du texte: Août 06 | 2015 Ceci est le sous-titre du texte: Q & A | 01 | Université | Conception graphique | Configuration de la conception | Sublime | Atome | thinkbot | Lieu de travail | Collaboration et appariement | Vim avocats | Routine quotidienne | Standups | Les clients | Promenades de café | Vendredis d'investissement | Voici le href: http://betweenscreens.fm/episodes/138/ Ceci est l'en-tête brut:

Roberto Machado

C'est la date brute: Août 03 | 2015 Voici le sous-titre brut:

PDG @ Subvisual | RubyConf Portugal | Ecole de créateurs | Conseil | Modèles de société | Amis du groupe | Startup portugaise | Rebranding | Technologies utilisées | Cadres JS | TDD & BDD | Erreurs de démarrage | Culture d'apprentissage | Jeunes entrepreneurs

Ceci est le lien brut: Roberto Machado Ceci est l'en-tête de texte: Roberto Machado Ceci est la date du texte: Août 03 | 2015 Ceci est le sous-titre du texte: CEO @ Subvisual | RubyConf Portugal | Ecole de créateurs | Conseil | Modèles de société | Amis du groupe | Startup portugaise | Rebranding | Technologies utilisées | Cadres JS | TDD & BDD | Erreurs de démarrage | Culture d'apprentissage | Jeunes entrepreneurs Voici le href: http://betweenscreens.fm/episodes/137/

Neat, n'est ce pas? Vous pouvez faire la même chose pour extraire le [:classe] d'un sélecteur.

require 'nokogiri' require 'open-uri "url =' http://betweenscreens.fm/ '= Nokogiri :: HTML (open (url)) body_classes = page.at_css (" body ") [: class]

Si ce nœud a plus d'une classe, vous obtiendrez une liste de toutes les classes..

Navigation de nœud

  • parent
  • les enfants
  • previous_sibling
  • next_sibling

Nous sommes habitués à traiter avec des arborescences en CSS ou même jQuery. Ce serait une douleur si Nokogiri ne proposait pas une API pratique pour se déplacer dans de tels arbres.

some_scraper.rb

require 'nokogiri' require "open-uri" url = 'http://betweenscreens.fm/' = Nokogiri :: HTML (open (url)) en-tête = page.at_css ("h2.post-title") header_children = page.at_css ("h2.post-title"). Enfants header_parent = page.at_css ("h2.post-title"). parent header_prev_sibling = page.at_css ("h2.post-title"). previous_sibling met "#  header \ n \ n "met" # header_children \ n \ n "met" # header_parent \ n \ n "met" # header_prev_sibling \ n \ n "

Sortie

#entête 

Jason Long

#header_children Jason Long #header_parent
25 octobre | 2016

Jason Long

Open source | Empathie | Barrières basses | Outil d'apprentissage | Contributions à la conception | Site web Git | Marque | GitHub | Neovim | Tmux | Design love | Connaître le public | Montrant le travail | Dribbble | Progressions | Des idées

#header_previous_sibling 25 octobre | 2016

Comme vous pouvez le constater, il s’agit là de choses assez puissantes, surtout lorsque vous voyez ce que .parent était capable de recueillir en une seule fois. Au lieu de définir manuellement un groupe de nœuds, vous pouvez les collecter en gros.

Vous pouvez même les chaîner pour des traversées plus complexes. Vous pouvez prendre cela aussi compliqué que vous le souhaitez, bien sûr, mais je vous conseillerais de garder les choses simples. Cela peut rapidement devenir un peu lourd et difficile à comprendre. Rappelez-vous, "Keep it simple, stupid!"

… Header_parent_parent = page.at_css ("h2.post-title"). Parent.parent header_prev_sibling_parent_children = page.at_css ("h2.post-title"). Previous_sibling.parent.children… 

some_scraper.rb

require 'nokogiri' require "open-uri" url = 'http://betweenscreens.fm/' = Nokogiri :: HTML (open (url)) header = page.at_css ("h2.post-title") header_prev_sibling_children = page.at_css ("h2.post-title"). previous_sibling.children header_parent_parent = page.at_css ("h2.post-title"). parent.parent header_prev_sibling_parent = page.at_css ("h2.post-title"). previous_sibling .parent header_prev_sibling_parent_children = page.at_css ("h2.post-title"). previous_sibling.parent.children met "# header \ n \ n" met "# header_prev_sibling_children \ n \ n" met "# 

Sortie

#entête 

Jason Long

#header_previous_sibling_children 25 octobre | 2016 #header_parent_parent
  • 25 octobre | 2016

    Jason Long

    Open source | Empathie | Barrières basses | Outil d'apprentissage | Contributions à la conception | Site web Git | Marque | GitHub | Neovim | Tmux | Design love | Connaître le public | Montrant le travail | Dribbble | Progressions | Des idées

  • #header_previous_sibling_parent
    25 octobre | 2016

    Jason Long

    Open source | Empathie | Barrières basses | Outil d'apprentissage | Contributions à la conception | Site web Git | Marque | GitHub | Neovim | Tmux | Design love | Connaître le public | Montrant le travail | Dribbble | Progressions | Des idées

    #header_previous_sibling_parent_children 25 octobre | 2016

    Jason Long

    <