Pascal: karakteres olvasással szeretném HTML fájlból kinyerni az összes linket. Miként lehet a legegyszerűbben ezt megvalósítani?
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.
Igaz, tényleg nem volt korrekt az 1 nap. Átjavítom 1 órára. Kényelmes telepítgetéssel ehhez nem kell több:
```python
from bs4 import BeautifulSoup
with open ("data.txt", "r") as myfile:
> html_doc=myfile.read().replace('\n', '')
soup = BeautifulSoup(html_doc, 'html.parser')
for link in soup.find_all('a'):
> print(link.get('href'))
```
Mondjuk az is igaz, hogy a linkek kinyerése az Internet Tools-al Pascal-ban sem kerül több sorba. Nem értem, a Kérdező miért nem azt használja, dehát mindegy...
Oldásként: ezt ragasszátok ki valahová! :D
Nem találtam meg a letöltési linket, csak a Wiki-t.
Lazarus telepítése nélkül is le tudom fordítani az Internettools-t?
Nem nagyon szeretem a Lazarust, ezért inkább Delphi alatt készülnek ezek a szösszenetek. 98%-ig az alapok kompatibilisek.
program Project2;
{$APPTYPE CONSOLE} //Delphi miatt
uses SysUtils, StrUtils //PosEx miatt;
var f: text;
s, s1: String;
pos1, pos2: integer;
begin
Assign(f, ParamStr(1));
Reset(f);
while not Eof(f) do
begin
ReadLn(f, s);
s1 := s1 + s;
end;
Close(f);
s1 := UpperCase(s1);
pos2 := 1;
while pos1 <> 0 do
begin
pos1 := PosEx('<A HREF="', s1, pos2);
if pos1 = 0 then Break;
pos2 := PosEx('">', s1, pos1);
WriteLn(Copy(s1, pos1 + 9, pos2 - pos1 - 9));
pos2 := pos1 + 9;
end;
ReadLn;
end.
Minek ide 3 sor és 5 perc? Itt van 10 másodperc és 1 sor alatt ami weboldalról letölti a linkeket Wolfram nyelven.
Import[" [link] "Hyperlinks"]
Ha ezt nem string használatával hanem file of char és karakter olvasásával akartam volna megoldani, az is lehetséges lett volna?
Az olyan problémákat is megoldja ez a stringes megoldás, mint hogy pl. a link két sorba törik?
- Igen, csak akkor pár sorral több lett volna.
- Igen, mivel az egész file-t egy stringként kezeli. {$H+} legyen hozzáadva
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!