Kezdőoldal » Számítástechnika » Programozás » Pascal: karakteres olvasással...

Pascal: karakteres olvasással szeretném HTML fájlból kinyerni az összes linket. Miként lehet a legegyszerűbben ezt megvalósítani?

Figyelt kérdés

Miként lehetne legegyszerűbben HTML fájlokból hivatkozásokat kiolvasni Free Pascal segítségével?

Találtam egy projektet, ami tud ilyet is sokminden más mellett, de az elég komplikált volt nekem, valamint nekem csak hivatkozások kiolvasására lenne szükségem.

Szeretném, ha akkor is működne, ha <A href, <A HREF formában van megadva a fájlban a hivatkozás.


Nem tudom, szabályos -e, hogy a halmaznevet nagybetűvel írtam, bár semmir nem mentem vele, mert a "not in" utasítást sehol nem volt hajlandó elfogadni a Pascal.


Nem AnsiString és ehhez hasonlókkal szeretném megoldani a beolvasást, hanem így, karakterenként.

Miként oldható az meg, hogy ki is lépjen szabályosan, ha az olvasás a fájl végére ért/nem várható több adott karakter és így a feltétel soha nem teljesülhet?


Elegánsabb, frappánsabb megoldása is van ennek annál, hogy pl. folyamatosan pakolnám a stringbe a karaktereket, és meghívnám a pos függvényt a konstansként definiált stringgel, majd ha >0 akor kilép?


program link_kiir;


{$MODE OBJFPC} {$H+}


const

link_eleje : string = ('<a href=' );

link_hatarolok: set of char=(['"',chr(39)]);

CRLf:set of char = ([#10,#13]);


var

f : file of char;

ch : char;

link, link_belseje : string;

karakter : byte;

begin

Assign (f, ParamStr (1) );

Reset (f);

repeat

link := '';

karakter := 1;

repeat

Read (f, ch);

if (ch <> '"') and (ch <> Chr (39)) then begin

if (ch = link_eleje[karakter]) then

begin

link := link+ch;

inc(karakter);

end

else

if (ch <> link_eleje [karakter]) and (karakter > 1) then dec(karakter)

end;

until (karakter = Length ( link_eleje ) );

WriteLn(link);

link_belseje := '';

while (ch <> '"') and (ch <> Chr (39)) do

begin

Read(f, ch);

if (ch <> '"') and (ch <> Chr (39)) then

link_belseje := link_belseje+ch;

end;

WriteLn(link_belseje);}

until Eof (f);

Close(f);

end.



2015. okt. 12. 13:29
1 2
 1/20 anonim ***** válasza:
Ha nem ragaszkodsz pascalhoz, egy masik fejlettebb nyelven egy ilyet meg lehet csinalni 3 sorban es 5 perc alatt
2015. okt. 12. 13:33
Hasznos számodra ez a válasz?
 2/20 anonim ***** válasza:

A karakterenkénti olvasásnál kifinomultabb megoldás: reguláris kifejezések.


Annál is kifinomultabb megoldás: HTML parszer könyvtár használata, ahol akár CSS szelektor alapján kiválaszthatsz elemeket. Nem tudom Pascal-hoz milyenek vannak (Google megmondja helyettem), de Java-hoz ott van a Jsoup, Ruby-hoz a Nokogiri.

2015. okt. 12. 13:35
Hasznos számodra ez a válasz?
 3/20 A kérdező kommentje:
Én ezt elhiszem, az a helyzet, hogy más programozási nyelvet nem ismerek, egyet se. :(
2015. okt. 12. 13:36
 4/20 A kérdező kommentje:

Valami Internet Tools van Lazarus alá, de szerintem nagy, komplikált és bonyolult, valamint a letöltési linket meg se találtam, csak a Wiki-t.

[link]

2015. okt. 12. 13:37
 5/20 SimkoL ***** válasza:

Kezdetnek: if not (valami in halmaz) then...

Ha estig nem jön össze segítek :)

2015. okt. 12. 13:51
Hasznos számodra ez a válasz?
 6/20 A kérdező kommentje:

Köszönöm, megpróbálom.

Sikeresen benthagytam egy } jelet a bemásolt kódban véletlenül a link_belseje kiírás után, így nem fordul le :S

2015. okt. 12. 13:52
 7/20 anonim ***** válasza:

> az a helyzet, hogy más programozási nyelvet nem ismerek, egyet se. :(


Python-nal egy nap alatt eljutnál idáig. :)

2015. okt. 12. 14:21
Hasznos számodra ez a válasz?
 8/20 A kérdező kommentje:

Köszönöm, így már sikerült a halmazokat felhasználni.

A megvalósítás sajnos nem megy, nagyon hálás lennék a segítségért, hogy mi a rossz, mit kellene másképpen.


program link_kiir;


{$MODE OBJFPC} {$H+}


const

Link_eleje : string = ('<a href=' );

link_hatarolok: set of char=([ '"', Chr(39) ]);

CRLf:set of char = ([#10,#13]);


var

f : file of char;

ch : char;

link, link_belseje : string;

karakter : byte;

begin

Assign (f, ParamStr (1) );

Reset (f);

repeat

link := '';

link_belseje := '';

karakter := 1;

repeat

Read (f, ch);

if not (ch in CrLf) then begin

if (ch = link_eleje[karakter]) then

begin

link := link+ch;

inc(karakter);

end

else

if (ch <> link_eleje [karakter]) and (karakter > 1) then dec(karakter)

end;

until (karakter = Length ( link_eleje ) ) or ( Eof (f) );

link_belseje := '';

while not (ch in Link_hatarolok) and (not eof (f) ) do

begin

Read(f, ch);

if not (ch in CrLf) then

link_belseje := link_belseje+ch;

end;

WriteLn(link + link_belseje);

until Eof (f);

Close(f);

end.

2015. okt. 12. 14:25
 9/20 SimkoL ***** válasza:
'Python-nal egy nap alatt eljutnál idáig. :)' elmentek ti ahová én gondolom... Az sem egy csodanyelv.
2015. okt. 12. 15:47
Hasznos számodra ez a válasz?
 10/20 anonim ***** válasza:

És akkor most teljes indukcióval megállapítjuk, hogy egyik programozási nyelv sem csodanyelv. Köszönjük.


Tehát mi is a baj azzal, hogy


(1) próbálom kinyitni a kérdező szemét, hogy az NEM KORLÁT, hogy csak egy nyelvet ismer, nyugodtan megtanulhat egy másikat?


(2) a Python nyelvet ajánlom, ami identálásra tanít, ugyanakkor tizedannyi gépeléssel és erőfeszítéssel sokkal flexibilisebben tudná megoldani a feladatot?

2015. okt. 12. 15:58
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!