ugrás a tartalomhoz

perl minta illesztés HTML kódra

lorko · 2007. Nov. 29. (Cs), 02.11
sziasztok,

táblázatokat szertnék kinyerni egy html oldalból de sehogy se megy.
próbáltam mintaillesztést írni de valhol mindig megbukik,
próbáltam html::parser-t de az se jó (vagy én nem csinálom jól).

a lényeg van egy html kód:
<html>
 <head>
  ...
 </head>
 <body>
  ...
  lorem ipsum
  ...

  <table>
    <table>
    </table>
  </table>

  <table>
    <table>
    </table>
  </table>

  <table>
    <table>
    </table>
  </table>
...
mégtöbb tábla
...
  <table>
    <table>
    </table>
  </table>

  <table>
  </table>

 </body>
</html>
azt szertném hogy pl.: a 3. táblától adja vissza a tartalmat a 10. tábláig.
ha valaki tud erre valami megoldást, kérem írja meg.

előre is köszönöm
 
1

tableparser

flash42 · 2007. Nov. 29. (Cs), 11.19
A reguláris nyelvtanok gyengébb kifejezőképességgel bírnak, mint az általános XML nyelvtanok. Ezért mintaillesztéssel nehéz dolgozni. Rákerestem neten és ezt találtam, jónak tűnik:
perlcookbook
2

másra való

winston · 2007. Nov. 29. (Cs), 12.58
csendben megjegyezném, hogy az xml alapvetőleg másra való, mint a reguláris kifejezések.
3

csendesebben

flash42 · 2007. Nov. 29. (Cs), 13.58
ennek így most nem volt sok értelme, nézzél utána a formális nyelvtanok tulajdonságainak. az xml-t amúgy lehet nyelvtan írására használni, a reguláris kifejezést is.
5

xml != regexp

winston · 2007. Nov. 29. (Cs), 15.05
[off]már megbocsáss, de nem szeretem, ha csittegetnek. mindenesetre noflame[/off]

vitatkoznék azzal amit te írsz: az xml egy jelölőnyelv, hogy mire lehet használni, az egy dolog, alapvetőleg mégis jelölőnyelv. én akár magyar mondatokban is kifejtek neked egy reguláris kifejezést (pl.: "kezdődjön nagy A betűvel, és utána mindegy mi van"), vagy biztos sokféleképp leírhatóak, és maga a reguláris kifejezés pontosan erre valóm, de az xml egy teljesen más technológia. rengeteg minden épül(het), úgy mint xhtml, xslt, soap, wsdl, rss, akármi. az, hogy valamilyen formában le tudod írni xml-ben egy reguláris kifejezést (vagy akár nyelvet, bizonyára lehet kitalálni ilyen xml felépítést, pont azért, mert az xml elég sokoldalú, sőt talán van is, erről nem tudok), az nem az jelenti, hogy a két technológia azonos célt szolgál. (megj.: nem azt írtam, hogy nem lehet használni, azt írtam: nem arra való, vagyis nem arra találták ki. szvsz)

és csak még csendesebben megjegyzem: tanultam formális nyelvtanokat. elég tág témakör. (megboldogult Bach Iván is többszáz oldalt írt róluk) konkrétan mire akarsz utalni?
6

Új téma

Török Gábor · 2007. Nov. 29. (Cs), 15.45
Magánpárbeszédetek nem segít az eredeti témát felvető problémáján, új témában lesztek szívesek folytatni az értekezést. Köszönöm.
4

kipróbálom

lorko · 2007. Nov. 29. (Cs), 14.26
kipróbálom a TableContentParser-t és még a TagParser-t is,
és jelzem hogy műkszik-e.

és köszönöm
7

HTML::TreeBuilder

bado · 2007. Nov. 29. (Cs), 19.56
Nem ismerem a TableContentParser-t meg a TagParser-t, de nem is hangzanak valami jól:) Használd a TreeBuilder-t, ami egyébként a HTML::Parser-t használja.

use HTML::TreeBuilder;

my $h = HTML::TreeBuilder->new();
$h->parse( $htmlkod );
my @tablak = $h->find_by_tag_name('table');

for (my $i = 2; $i < 10; $i++) {
   print $tablak[$i]->as_HTML();
}
Nem tudom, hogy érted pontosan azt, hogy a harmadiktól a tizedikig, de ha nem így, akkor esetleg megnézed, hogy van-e az elemen belül másik table, vagy van még jó pár eljárás, amivel ki tudod gyűjteni ami kell.

http://search.cpan.org/~petek/HTML-Tree-3.23/lib/HTML/Element.pm

üdv.
8

nos sikerült

lorko · 2007. Nov. 29. (Cs), 21.14
sikerült megcsinálni a TableContentParser-el.
A TreeBuilder-el találkoztam, és mostmár a puszta kíváncsiság kedvéért ki is próbálom.

A TableContentParser-es megoldás ilyen lett:
#!/usr/bin/perl 

use CGI ':standard';
use CGI::Carp qw(fatalsToBrowser);
use utf8;
use strict;
use LWP::Simple;
use HTML::TableContentParser;

my $url = param('url');
my $content = get $url || die;
my ($content) = ( $content =~ m!<body[^>]*>(.*)</body>!si );
utf8::encode($content);

print header(-charset => 'utf-8', -type=>"text/html");

my  $p = HTML::TableContentParser->new();
my  $tables = $p->parse($content);
my  $all = (@$tables);

foreach my $loop (13 .. $all){
   my $modules = $tables->[$loop];

     foreach my $r (@{ $modules->{rows} }) {
	for my $c (@{$r->{cells}}) {
		print "$c->{data}";   
	}
     }
     print "<br />";
}
ez az egész egy ajaxot szolgál ki, olyan cross-domain szerűség.

Köszönöm mindenkinek a segítséget.