Question

J'ai deux ou trois sites que je veux extraire les données et sur la base des expériences précédentes, ce n'est pas aussi facile qu'il le son. Pourquoi? Tout simplement parce que les pages HTML que je dois parse ne sont pas correctement formatées (balise manquante fermeture, etc.).

Étant donné que je n'ai pas de contraintes en ce qui concerne la technologie, la langue ou de l'outil que je peux utiliser, Quelles sont vos suggestions pour analyser facilement et extraire des données à partir des pages HTML ? J'ai essayé HTML Agility Pack, BeautifulSoup, et même ces outils ne sont pas parfaits (HTML Agility Pack est bogué et moteur d'analyse BeautifulSoup ne fonctionne pas avec les pages je passe à elle).

Merci!

Était-ce utile?

La solution

Vous pouvez utiliser à peu près la langue que vous voulez il suffit de ne pas essayer et analyser HTML avec des expressions régulières.

Alors, permettez-moi de reformuler et de dire: vous pouvez utiliser une langue comme ça a un analyseur HTML, qui est à peu près tout inventé dans les 15-20 dernières années

.

Si vous rencontrez des problèmes avec certaines pages, je vous suggère de regarder dans les réparer avec HTML Tidy .

Autres conseils

Je pense que hpricot (lié par Colin Pickard) est ace. Ajouter scrubyt au mélange et vous obtenez un grattage html et interface de navigation avec la puissance correspondante de texte de Ruby http://scrubyt.org /

Voici quelques exemples de code de http://github.com/scrubber /scrubyt_examples/blob/7a219b58a67138da046aa7c1e221988a9e96c30e/twitter.rb

require 'rubygems'
require 'scrubyt'

# Simple exmaple for scraping basic
# information from a public Twitter
# account.

# Scrubyt.logger = Scrubyt::Logger.new

twitter_data = Scrubyt::Extractor.define do
  fetch 'http://www.twitter.com/scobleizer'

  profile_info '//ul[@class="about vcard entry-author"]' do
    full_name "//li//span[@class='fn']"
    location "//li//span[@class='adr']"
    website "//li//a[@class='url']/@href"
    bio "//li//span[@class='bio']"
  end
end

puts twitter_data.to_xml

Comme langage Java et une bibliothèque open source Jsoup sera une solution assez pour vous.

hpricot peut-être ce que vous recherchez.

Vous pouvez essayer DOMDocument classe. Il a deux méthodes pour chargement du contenu HTML. Je fais d'habitude l'utilisation de cette classe. Mon conseille sont préfixer un élément DOCTYPE au code HTML dans le cas où il n'a pas une seule et d'inspecter dans Firebug le code HTML qui résulte après l'analyse syntaxique. Dans certains cas, lorsque le balisage non valide est rencontrée, DOMDocument fait un peu de réorganisation des éléments HTML. De plus, s'il y a une balise meta spécifiant le jeu de caractères dans la source attention qu'il sera utilisé en interne par libxml lors de l'analyse du balisage. Voici un petit exemple

$html = file_get_contents('http://example.com');

$dom = new DOMDocument;
$oldValue = libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors($oldValue);

echo $dom->saveHTML();

Toute langue qui fonctionne avec HTML sur DOM niveau est bon.

pour perl est le module HTML :: TreeBuilder.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top