Autor Zpráva
TomášK
Profil
Stále dokola se tu opakuje dotaz na regulární výraz, který z HTML kódu vyparsuje nějakou konkrétní část. A většinou se téma dobere k nějakému funkčnímu výrazu. Opravdu neexistuje lepší způsob, jak v php parsovat HTML než jsou regulární výrazy?

Mám na mysli nějakou snadno použitelnou knihovnu pro parsování HTML. Jeff Atwood také tvrdí, že jsou regulární výrazy většinou zlo (eng). V článku i diskuzi jsou odkazy, ale na první pohled jsem tam funkční php html parser nenašel.

Proč podobná témata nekončí odkazem na takovou knihovnu? Neexistuje? Není snadno použitelná? Pokládáte použití regulárních výrazů za jednodušší? Efektivnější? Nebo je problém parsovat jen část dokumentu (např. jednu tabulku)? Nebo je problém jen v tom, že parser skoro nikdo nezná?

Sám momentálně programuju v Ruby, kde je knihovna Nokogiri, zde je příklad použití:
require 'nokogiri'
require 'open-uri'
 
# Get a Nokogiri::HTML:Document for the page we’re interested in...
 
doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))

# Do funky things with it using Nokogiri::XML::Node methods...
 
####
#  Search for nodes by css
doc.css('h3.r a.link').each do |link|
  puts link.content
end


Výsledný kód mi přijde řádově přehlednější a spolehlivější než regulární výraz.
AM_
Profil
třída domdocument
Majkl578
Profil
Nesouhlasím s tím, že regulární výrazy jsou zlo. Ani většinou. Používám je často, i na validaci vstupů z formulářů (třeba jeslti je vstup číslo) a nevidím v tom žádný zásadní problém.

Myšlenka použití DOM se mi zalíbila, tak jsem ho hned zkusil v praxi. A asi to vypadá i elegantněji, než regulár matchující třeba šestiřádkový kód.
TomášK
Profil
Majkl578:
Nedobře jsem to formuloval, nechtěl jsem říct, že regulární výrazy jsou zlo, ale že regulární výrazy použité na parsování HTML jsou (většinou) zlo. Pro jiné účely o jejich užitečnosti nepochybuju.

Téma, na které odkazuješ byla poslední kapka, která mě dohnalo k napsání této otázky. Odpověď tedy pravděpodobně zní, že dostupný nástroj na parsování existuje, jen není příliš rozšířený, proto se používají reguláry.
__construct
Profil
Nepovedal by som, že nie je rozšírené - je v štandardnej inštalácii od verzie 5 ..
Myslím, že sa jedná skôr o to, že znalosť regulárov je "základ", kdežto používanie DOMu je pre niekoho „ďalší programovací jazyk“ a ešte na napadá na základe čoho tvrdíš, že „proto se používají reguláry.“ ?
TomášK
Profil
__construct:
Rozšířené jsem měl na mysli v povědomí mezi programátory, nikoliv technicky dostupné. K tomu, že se často používají reguláry, mě dovedly jen časté dotazy na zdejší diskusi a fakt, že jako odpověď často nebyl parser, ale regulár. Když se nad tím zamyšlím, skutečná příčina je ta, že ten, kdo na to použije domdocument pravděpodobně nemá potřebu se na nic ptát.
Chamurappi
Profil
Reaguji na TomášeK:
Pokud člověk ví, jak přesně vypadá ten kousek HTML kódu (nebo čehokoliv jiného), který chce zpracovávat, není potřeba povolávat robustní parser. Oproti „programovacímu“ postupu mají tu výhodu, že na ně programátor nepotřebuje další specializované znalosti (znalost Nokogiri z Ruby ti je skoro k ničemu při práci s DOMDocumentem v PHP) a může použít stejný mechanismus (a totožný výraz), který si natrénoval třeba v textovém editoru.

Zpracovávat neznámé HTML kódy s nepředvídatelnou strukturou jsem musel zatím jen jednou, ale potřeboval jsem být co nejvíc kompatibilní s jiným HTML parserem (OpenSP), takže použití hotové knihovny nepřicházelo v úvahu a skončil jsem též u regulárních výrazů.
Joker
Profil
TomášK:
Opravdu neexistuje lepší způsob, jak v php parsovat HTML než jsou regulární výrazy?
To jistě existuje. Ale podle mě záleží na úkolu, který to má plnit. Neřekl bych, že použít HTML parser je vždycky nebo v drtivé většině případů výhodnější.
Můj názor:
- O práci přes řetězce bych uvažoval v případě, že hledám jasně danou část jasně daného kódu stránky (nejlíp generovaného z nějaké šablony). Pokud je zadání typu: "Na každé stránce je <p class="neco">prostý text bez značek</p> a je potřeba získat ten vnitřek", klidně bych na to šel přes řetězce. Kdyby úkol byl stejný, tj. získat vnitřek odstavce se třídou "něco", ale předem bych neznal kód stránky, použil bych HTML parser.
- Jsou úkoly, které jsou vhodnější pro parser, obvykle pokud se v dokumentu lze chytat IDček anebo CSS tříd, ale jsou zase úkoly vhodnější pro CSS zpracování, příklad: Kód bude obsah tabulky, kde bude vždycky <td>popis</td><td>hodnota</td> a chci získat hodnotu buňky, před kterou je popis "Jméno".
- U mnoha zadání se zdá, že HTML parser je robustnější, zatímco řetězcové zpracování je víc závislé na neměnné struktuře stránky, ale ve skutečnosti často změna struktury stránky vyřídí obě řešení a obě je pak potřeba upravovat.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0