Il y a longtemps que je voulais traduire cette réponse de StackOverflow, qui donne une bonne fois pour toute la réponse à cette question souvent posée.
Voici (le formatage exotique a été conservé au maximum):
Vous ne pouvez pas analyser [X]HTML avec des regex. Parce qu’HTML ne peut être analysé par des regex. Les regex sont un outil qui ne peut être utilisé pour analyser correctement du HTML. Comme je l’ai répondu dans des question HTML-et-regex ici de nombreuses fois auparavant, l’utilisation de regex ne permet pas de consommer du HTML. Les expressions rationnelles sont un outil qui n’est pas suffisamment sophistiqué pour comprendre les constructions employées par HTML. HTML n’est pas une langage rationnel, et de fait ne peut être parsé par des expressions rationnelles. Les requêtes par regex ne sont pas équipées pour diviser du HTML en parties qui ont du sens. Tant de fois, mais je ne m’en lasse pas. Même des expressions irrationnelles telles qu’utilisées par Perl en sont pas à la hauteur de la tâche que représente l’analyse de HTML. Vous ne me ferez pas céder. HTML est un langage d’une complexité telle qu’il ne peut être analysé par des expressions rationnelles. Même Chuck Norris ne peut analyser du HTML avec des expressions rationnelles. Chaque fois que vous essayez d’analyser du HTML avec des expressions rationnelles, l’enfant damné pleure du sang de vierge, et des hackers russes pown votre webapp. Analyser du HTML avec des regex invoque des âmes perdues dans le royaume des vivants. HTML et les regex vont ensemble comme l’amour, le mariage et les rituels infanticides. Le <center> ne peut tenir, il est trop tard. La force des regex et du HTML ensemble dans le même espace conceptuel détruira votre esprit comme l’humidité détruit les joints. Si vous analysez du HTML avec des regex, vous vous adonnez à Eux et leurs traditions blasphématoires qui nous condamnent tous à un labeur inhumain pour Celui dont le Nom ne peut être exprimé avec le Plan Multilingue Basique, il arrive. HTML-plus-regex liquéfiera les nerfs des êtres les plus sensibles sous vos yeux, votre psyché dépérissant sous les assauts de l’horreur. Les an̷al̵y͘s̕e͝urs ̸HT͝M͡L basés sur les regex sont le cancer qui tue StackOverflow il est trop tard il est trop tard nous ne pouvons être sauvés la trangession d’un en̵f͝ant amènera les regex à consommer tout tissue vivant (excepté pour le HTML puisqu’il ne le peut, tel que prophétisé précédemment) oh seigneur aide nous comment qui que ce soit peut-il survire à cet fléau utiliser des regex pour analyser du HTML a condamné l’humanité à la terreur de la torture and aux failles de sécurité utiliser les regex comme outil pour travailler du HTML établie un brèche entre ce monde et le royaume terrifiant des entités corrompues (comme les entités SGML, mais plus corrompues) un bref regard vers le monde des analyseurs regex pour HTML transportera instantanément la conscience d’un programmeur dans un monde de cris sans fin, il arrive, la nauséabonde plaie des infections regex dévoreront votre parser HTML, votre application et votre existence pour l’éternité comme l’a fait Visual Basic mais en pire il arrive il arrive ne vous débattez pas i̢l͞ a͘rr̸i҉v̡é,̨ sa radiance damnée détruisant toute illumination, des ͠t̕a̕g͡s ̶H͞TM̵L͞ ̕c̸o͜ùlan͜t̀ de̶ vos͜ ͟y͏eưx te̷l̛s̡ de l͜a̶ ̛d͝ǫu͜lȩur҉ ͝l̡iquid͝ee, la chanson de l’analyse par expressions rationnelles reduit au silence les voix de l’homme mortel depuis la sphère je peux le voir pouvez-vous le voir c’est magnifique l’expurgation de tous les mensonges de l’Homme TOUT EST PERDU TOUT EST PERDU le poney il arrive i͟l arrive il̸ ̕arr̴i҉ve͢ ̕l’̵ich҉or ̸p̴é͝n͘è͟t̡r͞e tout MON V̴ISA҉ĢE͘͜ M̵̢͟O̶N ͢͏V͏I̧̨S͞AG̶̕͞E̷̡̕ oh mon dieu no Ņ̵̨ON̕ ̢҉̀N̸͡͞OO͏̢͝O̶͠O̷҉N҉͝ ͡N̶͘͏O̧N͟ ́͜͡s̀͟͡t̶͟o̧͝p̧ ̕͘l̴e҉͠s ͟ań̴gl͏ę̀͏s͢͝ ͜͝n̡e͏̡ ́so҉͜nt̵̡ ͢p̧͘a̛s̀ ̸͞r͞é̕͞e̛l̸͏s̨ ̧̀ZA̷Ĺ͝GO̸ ̸E̴͜͝Ş̵̛T̴̸͠ ̨T̨̢Ó͜N͡Y̢ ̷̨̕L̀E̵͠ PONE̕Y͟ I͖̮̝̥̞͟L̴̬͈͍͞ ̞̦A̴҉͕̩͉R͎͉̯̼̹̫͈̹R̩͎̙̥̦I̶̢͓̘̗V̤̳͓͓͇̯̭̯̥͜͢͢E̹̣͚̩̯̙͡.
Avez vous essayé un parser XML à la place ?
En lisant le titre, j’ai eu peur, mais en fait, ouf! Je suis rassuré :)
tu le fais en perl ( html:parser) et on en parle plus :)
+1 avec N.
Pour le html, il y a beautifulSoup. OK. Mais vous vous en sortez comment pour le reste ?
J’ai déjà vu ça http://simpleparse.sourceforge.net/ mais je n’ai jamais testé. Des avis ?
C’est le problème chiant que je n’ai pas résolu. Il y a trois jours, je devais faire en sorte que
\cor{foo bar blah \cite{truc} machin}
foo bar blah \cite{truc} machin
et c’est toujours prise de tête.
C’est quoi le reste ?
Pour ce qui est de parser du HTML avec une regexp, il faut savoir que les avis parmi les dev sont partagés.
La plupart soutiennent béatement que “C’est impossible”
Cependant, il s’agit là de l’avis de ceux qui n’ont jamais essayé. Ceux qui ont tenté l’aventure, en revanche, tiennent pour assuré que “Afla Ableu Aflableu”, puis il font sous eux en hurlant et en ricanant.
Par reste, j’entends n’importe quel tag (de conception maison ou pas) qui comprends un balise ouvrante et fermante. Ca peut être du latex, du markdown ou que sais-je.
PS : il manque un “devienne” dans mon exemple, entre les deux lignes.
Des créateurs de parseurs, y en une chiée en Python, mais c’est vrai que je n’ai jamais eu à les utiliser:
http://nedbatchelder.com/text/python-parsers.html
Tous les dév savent que ça sert à rien de parser du HTML, il y a autant de style html que de dev html…c’est à dire une montagne de caca, avec des morceaux qui collent sur la cuvette même quand tu tires la chasse.
lxml pour ses perfs !!
Oui mais lxml ne gère pas le html mal formé aussi bien que beautifoul soup par contre.
Au fait, tu me sembles avoir réglé tes problèmes d’encodage dans le blog.
Parce que pour afficher des croublougnastreries pareilles, faut être sacrément équipé.
@Sam merci pour le pointeur.
Non, mais sinon, en vrai, comment on fait avec des REGEX ?
@Recher: pas vraiment, j’ai été étonné que ça passe. J’ai du m’y reprendre à plusieurs fois, y avait des symboles qui passaient pas, mais le rendu final est pas mal.
Haha il m’a vendu du rêve, mais au moins maintenant j’ai compris le message.
Cependant j’avoue n’avoir jamais essayé , à essayer avec une oudjabord à côté pour voir ce que ça donne.
@sam: C’est un argument qui ferait bondir le W3C, mais il est , malheureusement, valable…et pertinent!
T̴͖͓̙̤̖̝͕̂͌́̍̐ͬ̀͠o̟͖͓̺̎̆ͥ͊͐ͦ̇̈̉ ̷̧̤ͭͦ̅̂̑͐̍̔į͎̥͚̺ͦ̕n͎͖̯͑ͣv̴͈̫̥̹͇̖̝͇̅ͦͪ̚o̸͎̙̩ͤ͒ḱ̙̣̃ͦ́ͭ̔̒̏͢ͅę̷̫̊̐ͩ̍̾ ̢͙̊̿ͥͫ͢t̻̗͔̳̳̀̊ͬ̽̆h̨̛͖̹̙̫͈͇̅̈̒̊͡e̷̫͓̲͍ͥ̍͐̿ͧ ̛̦̓̓̂ͫ́͂͠h̜̬̋ͯ̃̉͛ͨ̈́̀į͚̜̼̽̒̅̈́͌̃̄͒͒͡ͅv̵̻̹̮͔̯͔͙͉͊͟͟e͂̿̅ͩ̓͗̿̄͏̵̨̥͙-̩̜̭̦̥̣̫͙̊́ͮ̇̌̂ͤͮͫm͉̜̪͔̬̘ͪͥ͒̉͗͡i̬̗̫̙͊͠n̵̢̘̖̻ͥ̐͗̌̄ͅd̸̑͐҉̧̹̩̙̞̻͇ ̅̉͂͏͖̹̗̩͙́ṛ̛͙̑̕͜e̸͕̼͚͙ͯ̽p̡͖̰̞̲̘̖͔͊͡r̩̜̱̩̗͒̔̅͊́̇̈́ͫe̴̩̬̘̝̐̏̂͌ŝ͇̗ͦͥ͒͞e̼͌͂̾̀ͦ̐̈̄n̝̥͙͛̏̃ͧ͒͑t̖͔̭ͭ̀ͩͥ̕i̶̶̢̺̜͈ͫ̇ͅn̝̱͙̱͈̆̽ͅg̷͈̫͓ͩ̃͊̾ͦ ̧̳͔̖͉͙͗̊̆̂̎̏͑̚c͖̑̾ͦ̚̕h̨̖̝͔ͧ͟a̵͇͕̞̫͌͋̌ͪͧ̔̕͠o͆̔ͬ̽̅̐͏̷̠̻̣s̴̨̞͇̺̭̬͔͎̀͐̔͌͆ͤͣ͗.̦̤͔̳̬͗̾̈̉ͣͯͦ̐
͉̫ͪ̾͆ͩͤ̔͢͢Į̤̤̘̰͇̆͌͂͢͝n̢̝̝̲̲̯̝̣ͯ̾ͤ̊͑ͭͮ͞v̷̢̬ͩ̔ͥ̓̓̅̚o̵͎̦͇͎̤̝̗͒̆̾ͨͣ̈́k̳̙ͬ̌̎͜i̸̹̟̞͖̠̓ͨͮ̚n̡͇͖̘̟̺̦͎̻̐͂́̑̇g̰ͯ̉ ̼ͪ́̋̂ͧ͗͘͟t̍ͦͮ̔͢͏̻̭̹͚̣̮h̛̙̟̓͢ę̸̲͉̎̿̑̀̇ ̯̲̅ͮͨ̑̽̓̆̈͘͡f͕͉͎̭̬̜͋ͦ͆͐̿ͪ̾̽e̤̦̥͖̥̦͉̜̳͐̋̊ͮ͠é̴͖͔͙̟̺̅̑̓ͯ̎l͍͖̣̝͇̒͝i̮̤̫̣̰͓̦ͫ̍̓́ͯ̉ͩn̿ͫ͏̵̻̟̜g̖̫͎̅ͫ͢ ͭ̑̐͐̓ͩ҉̮̝̜̗̺͍̗o̓ͪ̈́͂̉͗͆̔͏̶̻̙̲̝͔̗͖̤͝f̣̯̹͓ͦͤ̓̐́̃̇̈ͅͅ ̞̘̳͉̣̈̾ͬ̍͡c̛͉̭̘̭̭̫͂͊ͩͪͮ̀̈̆͗́͡h̴̴̜̻̻͊̋̂̎̈͑̽ͣa̶̠̫̎̐ͅo̥̹̹̞͙̩͋͆́s̴̳͇̜̳͚͇͖̣̈́̂ͬ̈ͣ̃̋̔.̛͙̳̟̳͛̄͟
̧͓͈͚̦̮͎̊͐̌͡͡W̡̙̤͚ͬ̏ͦͅi̹͓̬̮̘̲̹̤͖ͧ̓ͥͥ̂̿͆ͤ͑t̨ͥ͛͌͏҉̦̱͙̰̭̰h̛̬͕̳͍͕̀ͣ̽̚̕͢ͅ ̴̴̣͍̪̠̦̳̪́̔̆͊ͧ̅ő̢̘̝̜̥̠̱̰̂̾̂͢ǔ̶̥̟͆ͧͩ̔͂̚͝ṫ̥̾̆ͮ̅̄̅͆̀͟͠ ̸͔͖̞̍ͦͩ͋͂̍̒̾͜o̢͖̗͉͋ͤ͗͒͘r̟̝ͤͥ͗ď̦̦̰͚͖͉̏̀̄͒ͭͯ̌̚͠ȩ͓͖̓̅̓́́ͅr̖͖̞̅͊̓͗͋̆̇̇.͕̰̺̖͔̞ͣ͐͘͝
͓̺̝͌̕T̝̙̤̙̬̻̣̺͑͌͡h̨̡̡̭̦͉ͯ͋̒͊eͫͤ̅̓̑̚͏̢̮̯̦̭ ̸̳̹̝̱̜ͮͤ̈́͠N̯̲͙ͯ̀̈͊̐ͮȩ͎͍͔͚͍̩̩̈́͌̅̾̀̕͢ͅz̴͇̹̫̋̾̽ͤͪ͊͗ͪ̕p̙̫͔̗̯͍̳͑̽́̈́ͩ͢ḛ͉̉̎r̩̓ͪḓ̶̨̼͉̰͔̠̞͇̊͗͋ͅi̻̰̊ͪ͢a̬͉̙̭̰̣͓ͫ̐͐͑ͥ̓̏ń̸͕͓͙̲̗͎͗͋̃̆̃̕͢ ͇̱̬̦̦̼̪̙͌ͭ̾̇̔h̙͉͕̖͈̮̎̇̅́̕i̭̞̺̜͕̹̊ͣͯ̾̌̀̓̃̿͢v̶̯͗͐̒̿̍͛e̷̺̩͉̠͊ͬ͌̽͘ͅ-̧͇̯͛́̍̎͗͐͋͘͝m̰͙̏͊͛͊́ͣ͂͞i̤̥̤ͨ͋͊̔͛̿ͩn̨̙̺̜̖̞̓̅̆͝d̩͕͇̣̒͆ ̅̄͛́͐͏͚̟̹̣̥̳̟̰ͅo̹̜͉̼͇ͩ͡ͅf̊ͥ҉̨̦̯̗͎ ̠͓ͨ͋ͩ̔ͣ̉̉̉͘͡c̴̛̜̦̱̟̣͑̄͊͒̅ͬ́̏ͭh̼͍̺̮ͬͭͥ̚͡a̤̲̠ͯ͑ó̶̡̜̩͕̑ͬ̿͗̀s̸̹ͥ̅̿̅ͣ̏̓̃.̿ͭ̅̀͋̄ͬ҉̸̳͍̤̩͕̭́ ̜̮͆ͪ̊Ź͋͠͏̧̜̹̮̟͎͙̣aͯ͏̞̰͔̮̻͉͔̠͔l̗͚̙̭̗̰̏̈́̚͟g͎̲̿̈́ǫ̱̝͇̳̒͌͌̽ͨ͟.̿ͦͫ̆̌̈́̚҉̷̦͚̻ ̤̻̥̱̩̤̒ͨ͐͑̎̈́ͅ
ͯͬͭ̓͝͏̺H̵̥͈͉͈̭͎̖̠ͮ̎͛̑̎͒e̅͒̌ͬ͛̊̄̍҉̣̹ ̧͎̻̘̪̑̋̾́w̷̛͕̺ͯ͐̑̆͒͂̓ͯ̕h̴͍̭̹͇̗̥̄ͦo̴̵̱͔͈̜̰̱͌͑̆̃̊̿̏̀ ́̽͑͏̝͖͖̭͖̞̩W̢̑̈ͯ̈́ͯ̽ͨ̿̿҉̱a̺̞͙̣͋̉͊ͩi̘̟̠̮̤̯̲̪̅ͭ̒̀ͣͧͯ͛t̨̹̭̙͕̎s̒͒ͮͨͨͬ̏҉̩͍̦̝̙̻̭̦ ̶̛͇̺͊ͯ̽ͫͯ͌ͯB̻̤͈͖̹̬̎͌̇̋͜ḛ̩ͩḧ̼̭́͗̉̏̋͐͜i̴̷͍͎̬͚̤ͨ̉̄ͤ͗ͦ͂͘n̪̰̲̼̩̤̹̽͒̑͒̓̏̂̚ḓ͎͔̞̠ͯͅ ̷̡̲̳̪̺̳̞̘̲̎͑̽́̉͡T̢̤̬̗̼̝͙̯̹ͨͥ̑̄ͦ͆̌̎͆h̷̩͈͇̐̒̉̚ȩ̱̫̃̇̌͑͘͘ ̡̡̦̤͛̅͐ͤ͡W̒̐͋͛͏̻͖͚͈̙͖͡ȧ̴̬̽̾ͬ̌ͦ̚͢l̻͚̅̆ͭ͑͂ͥ̾́͟͞͠l̢͚̃ͥ̐ͯ̀͆ͤͩ.̸̸̱̠̠͔̘̭̣̘͂̊ͪͩ̎ͮͪ
̧̖̩͋͌̓̀Z͓̦̪͎̞̦̐͒ͫ͟͝A͖̝̞̙͎̪͚ͭ͆̐̎Ļ͉̪̬̞͎̱̘ͪ́͌̉̉̃͂͠G̨̫̹̤̮̓ͨO̶͇̦͚̳̬̣͍̊̈͆̋̑̍̄̉ͅ!̛̭̤̺̲̪͈̞̺̣̓ͭ̊͋̐̓̉̚̕
Demande naïve de débutant : comment vous arrivez à mettre ce genre de caractères ? C’est de l’UTF8 avec des lettres spéciales ?
J͢’u͜t̀i҉͢li͠s͜e҉͢͟ u̵n͘͢ ͢géņ̴̸é҉͘r̢̢at̛e̴͢ur̀͡ ́g̕͢e͢ń̶r̴̴͡e̡̕͠
̶
http://textozor.com/zalgo-text/
Merci, effectivement, j’aurais du y penser (stacker des sub/sup-scripts).
Et comment font les navigateurs ? #troll
Avec un tokenizer. Voici le code du parseur HTML de mozilla. Tention, c’est pas pour le petites bites:
https://hg.mozilla.org/mozilla-central/file/834c8941ae24/parser/html
Comme tu dis, un sacré bordel.
C’est beau n’empêche d’avoir un langage aussi tolérant. Mais malheureusement des sites comme Linkeo font de la merde…
Attention à la mise en demeure.
Vous étiez au courant, beautifulsoup va beaucoup moins fonctionner sur du HTML foireux, cf http://sebsauvage.net/links/?PwAG5g
Oui j’ai écris à seb ça ce sujet:
Solution 1: utiliser une ancienne version de beautiful soup
Solution 2: utiliser ghost.py qui délègue ça à webkit
(http://jeanphix.me/Ghost.py/)
Solution 3: utiliser pygecko qui delegue ça au moteur de firefox
(http://pygecko.sourceforge.net/)
Solution 4: utiliser ElementSoup de lxml (http://lxml.de/elementsoup.html)