7
votes

Obtenir des mots de texte visible via Nokogiri

J'aimerais ouvrir une page Web avec Nokogiri et extraire tous les mots qu'un utilisateur voit lorsqu'il se rendit dans la page dans un navigateur et analysez la fréquence des mots.

Quel est le moyen le plus simple d'obtenir tous les mots lisibles à partir d'un document HTML avec Nokogiri? L'extrait de code idéal prendrait une page HTML (en tant que fichier, par exemple) et donner une maquette de mots individuels provenant de tous types d'éléments lisibles.

(pas besoin de s'inquiéter de JavaScript ou de CSS Cache des éléments en cachet et de cacher des mots; tout simplement tous les mots conçus pour l'affichage.)


1 commentaires

Le FYI Notez que les mots les plus intéressants ne sont souvent pas ceux qui apparaissent le plus. Vous devriez jeter un oeil à TF-IDF: goo.gl/m0Ie


3 Réponses :


4
votes

Si vous voulez vraiment faire cela avec Nokogiri (et vous pouvez simplement utiliser Regex pour désigner des balises), vous devriez alors:

  1. Doc = Nokogiri :: HTML (Ouvrir (URL '). Lisez) # Open-UriR
  2. Soutenez tous les balises JavaScript et de style avec quelque chose comme Doc.Search ('Script'). Chaque {| el | el.unlink}
  3. doc.text

0 commentaires

13
votes

Vous voulez le Nokogiri :: XML :: Noeud # inner_text code> Méthode:

# Find the most frequent words
require 'pp'
def frequencies(words)
  Hash[
    words.group_by(&:downcase).map{ |word,instances|
      [word,instances.length]
    }.sort_by(&:last).reverse
  ]
end
pp frequencies(words)
#=> {"nokogiri"=>34,
#=>  "a"=>27,
#=>  "html"=>18,
#=>  "function"=>17,
#=>  "s"=>13,
#=>  "var"=>13,
#=>  "b"=>12,
#=>  "c"=>11,
#=>  ...

# Hrm...let's drop the javascript code out of our words
html.css('script').remove
words = html.at('body').inner_text.scan(/\w+/)
pp frequencies(words)
#=> {"nokogiri"=>36,
#=>  "words"=>18,
#=>  "html"=>17,
#=>  "text"=>13,
#=>  "with"=>12,
#=>  "a"=>12,
#=>  "the"=>11,
#=>  "and"=>11,
#=>  ...


2 commentaires

Vous semblez savoir ce que vous faites - aucune idée de savoir comment obtenir le nombre de lignes dans le texte? Je pars un corps poème avec des balises

et de

.


@Kevin Posez une question (pas comme un commentaire à une réponse) et vous aurez probablement la solution dont vous avez besoin. Il existe de multiples façons, mais cela dépend de votre entrée et de vos désirs exacts.



0
votes

Mise à jour : Depuis Ruby 2.7 - Il y a une nouvelle méthode énumérable - Tally - pour compter les occurrences

bug dans la réponse choisie: html.at ('Corps'). inner_text - rejoindre tout le texte de tous les nœuds - sans espaces . Par exemple, document contenant:

ceci

texte

aboutira à "Theutext"

mieux: utiliser Cette réponse xxx


0 commentaires