Question

J'essaie de récupérer du HTML sur différents blogs et j'ai remarqué que différents fournisseurs utilisent la même balise de différentes manières.

Par exemple, voici deux fournisseurs majeurs qui utilisent différemment la balise du générateur de méta-noms :

  • Blogueur : <meta content='blogger' name='generator'/> (le contenu d'abord, le nom plus tard et, oui, des guillemets simples !)
  • WordPress : <meta name="generator" content="WordPress.com" /> (nom d'abord, contenu plus tard)

Existe-t-il un moyen d'extraire la valeur du contenu pour tous les cas (guillemets simples/doubles, premier/dernier de la ligne) ?

P.S.Bien que j'utilise Java, la réponse aiderait probablement plus de personnes si elle concernait les expressions régulières en général.

Était-ce utile?

La solution

La réponse est: n'utilisez pas d'expressions régulières.

Sérieusement.Utilisez un analyseur SGML ou un analyseur XML si vous savez qu'il s'agit d'un XML valide (probablement presque jamais vrai).Vous allez absolument tout gâcher et perdre des tonnes de temps à essayer de bien faire les choses.Utilisez simplement ce qui est déjà disponible.

Autres conseils

En fait, vous devriez probablement utiliser une sorte d'analyseur HTML où vous pouvez inspecter chaque nœud (et donc les attributs du nœud) dans le DOM de la page.Je n'en ai utilisé aucun depuis un moment, donc je ne connais pas les avantages et les inconvénients, mais voici une liste http://java-source.net/open-source/html-parsers

Ces différences ne sont pas vraiment importantes selon le standard XHTML.

En d’autres termes, c’est exactement la même chose.

De plus, si vous remplacez les guillemets doubles par des guillemets simples, ce sera la même chose.

La manière typique de « normaliser » un document XML consiste à le réduire à l’aide d’une API qui traite le document comme sa représentation Infoset.Les API de style DOM et SAX fonctionnent de cette façon.

Si vous souhaitez les analyser manuellement (ou avec un RegEx), vous devez reproduire toutes ces choses dans votre code et, à mon avis, ce n'est pas pratique.

Note:Les guillemets simples (même sans guillemets, si la valeur ne contient pas d'espace) sont valides selon la spécification HTML du W3C.Citation:

Par défaut, SGML exige que toutes les valeurs d'attribut soient délimitées à l'aide de guillemets doubles (ASCII décimal 34) ou de guillemets simples (ASCII décimal 39)...Dans certains cas, les auteurs peuvent préciser la valeur d'un attribut sans guillemets.

N'oubliez pas non plus que l'ordre des attributs peut être inversé et que d'autres attributs peuvent apparaître dans la balise.

Vous voudrez peut-être donner à Java KitÉditeur HTML un coup de feu.Il est facile d’expérimenter pour voir si l’analyse fournit ce que vous recherchez.

Ok, puisque vous recherchez une langue indépendante, vous pouvez essayer un REGEX comme /<meta\s.*content=.*>/ et prenez le résultat de cela et analysez les valeurs spécifiques que vous recherchez.Je ne suis en aucun cas un expert REGEX, il existe donc probablement un meilleur moyen, mais en utilisant l'outil à http://www.codehouse.com/webmaster_tools/regex/ J'ai fait correspondre les deux chaînes que vous avez fournies.

Si vous devez utiliser une regex, voici une regex pour obtenir uniquement la partie contenu :

content\s*=\s*['"].*?['"]

Retour

content = "blogger"

et

content='Worpress.com'

respectivement.Je ne suis pas un expert en regex, mais cela est obtenu lorsqu'on me donne vos exemples dans expression rationnelle.

Une fois que vous obtenez cela, vous pouvez tout obtenir entre les guillemets comme vous le souhaitez, qu'il s'agisse d'une autre expression régulière (ce qui est tout simplement immoral à ce stade) ou simplement d'une boucle sur les caractères.

Si vous utilisez Java, vous voudrez peut-être regarder soupe de balises, qui est un analyseur compatible SAX pour "[analyser] le HTML tel qu'il se trouve dans la nature".

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