Avatar billede osaka_san Nybegynder
14. april 2002 - 12:33 Der er 13 kommentarer og
1 løsning

Fange bestemte a href'er i html dokument

Hejsa folkens.

Jeg sidder lidt og roder med noget crawler værk og jeg har formodentlig bare stirret mig blind på det, men jeg ka nganske enkelt ikke finde en lækker måde at gøre følgende på via regex. Det skal lige siges at jeg bruger det i en windows .net applikation men det burde være perl based regexp så vidt jeg ved.


Jeg har en input streng der indeholder et HTML dokument der er crawlet fra en url.

Jeg ønsker at løbe dette dokument igennem og finde alle de links der eksistere til andre sider inden for det samme site.

Dvs det skal være links af følgende former:

<a href="/mitdir/minfil.minextension"....

<a href="mitdir/minfil.minextension"...

<a href=http://www.mitdomæne/mitdir/minfil.minextension"

Derudover vil det være at foretrække at kunne definere gyldige fil extensions således at den ikke tager .css med f.eks (hvis der er defineret et externt stylesheet), men kun links der reelt vil føre videre til en side der vil give html tilbage.

Jeg har rodet med nogle forsøg men de er alle klodsede, lange og kan kun opfylde en del af ønskerne.

Er der nogle af jer der skulle have ideer til en løsning eller måske ligefrem er stødt på problemet før og kan give mig en komplet løsning, så vil det hjælpe mig gevaldigt! :)

De bedste hilsner
Oscar Eg Gensmann
Avatar billede erikjacobsen Ekspert
14. april 2002 - 12:37 #1
Hvorfor ikke bare gøre af 2 omgange?
Først finde URL-er generelt med RegExp,
og så tage listen og løbe igennem med måske
et nyt RegExp?

Ingen kode - livet er for kort til .net
Avatar billede osaka_san Nybegynder
14. april 2002 - 12:38 #2
Det skal lige siges at hvad angår den sidste form så har jeg en streng som indeholder "baseURL'en" som jeg kan sende ned i regexp udtrykket således at f.eks baseurlen kan være

http://www.mitdomæne.dk/mitdir/mitdir

og den så vil skulle fange a href'er der rhar følgende link

http://www.mitdomæne.dk/mitdir/mitdir/mitdir/minfil.minextension

Samtidig skal den selvfølgelig også kunne fange

Dem alle uden fil og extension

a href="/mitdir/"....
<a href="mitdir/"...
<a href=http://www.mitdomæne/mitdir/"

og

a href="/mitdir"....
<a href="mitdir"...
<a href=http://www.mitdomæne/mitdir"

Mvh
Oscar
Avatar billede osaka_san Nybegynder
14. april 2002 - 12:50 #3
Erik>

Det var så nok der jeg havde satset lidtpå at kunne gøre det med en enkelt regexp ;-) eller noget lignende.

Mvh.
Oscar Eg Gensmann
Avatar billede erikjacobsen Ekspert
14. april 2002 - 12:55 #4
Jeg har også prøvet at spise hjemmebagt lagkage og børste tænder
samtidig for at spare tid - det var lidt svært... Derfor min anbefaling
om at splitte det op. Brugte du et "rigtigt" sprog kunne vi have lavet
en klasse eller to, der måske kunne genbruges.
Avatar billede osaka_san Nybegynder
14. april 2002 - 13:14 #5
Erik> nu er regexp jo netop kendt for at man med lidt snilde kan opnå ganske fornuftige resultater med 1 linie fremfor flere gennemløb.

Hvad angår din kommentar omkring et rigtigt sprog, så må jeg indrømme at jeg finder den en smule pubertær. Det kan godt være du ikke kan acceptere at folk har forskellige sprog præferencer, men den kommentar tjener intet formål, ud over at du måske føler en glæde ved at overbevise dig selv om at alle andre er tåber?

Derudover kan du så vidt jeg forstår sagtens lave klasser i .net der kan genbruges, afhængig af hvordan du fortolker klasser?

Jeg værdsætter din vurdering omkring at benytte flere gennemløb, og vil kigge på dette, men det skader ikke at tjekke med andre om der skulle være bedre muligheder, hvorfor jeg efter små 5 timers hjemmeforsøg valgte at oprette dette spørgsmål.

Det ville måske hjælpe hvis jeg mere specifikt havde forklaret at mit spørgsmål ikke bare gik ud på at få en hurtig løsning, men nærmere at få en optimal løsning. Det er hermed gjort.

Med Venlig Hilsen
Oscar Eg Gensmann
Avatar billede erikjacobsen Ekspert
14. april 2002 - 13:20 #6
Pubertært *gg* Den sætning skulle da også have været i nutid.... tsh tsh:

Bruger du et "rigtigt" sprog kan vi lave en klasse eller to, der måske kan genbruges.

Sagt i generelle vendinger, i al respekt for det OO, der er i .net. Bemærk venligst
at jeg ikke svarer, da jeg ikke kan/gider lave det for dig :)
Avatar billede da_nigga Nybegynder
14. april 2002 - 13:26 #7
erik > Ved ikke hvor lidt du kender til .net men det er fuldgyldige sprog.. Med klasser, inheritance, polymorphism og hvad der nu ellers følger med til et fuldgyldigt OOP sprog...

Så stop nu med at spille så smart og fortæl manden hvordan du vil løse det...
Avatar billede da_nigga Nybegynder
14. april 2002 - 13:27 #8
Rettelse... .NET indeholder fuldgyldige sprog... er det ikke selv...
Avatar billede osaka_san Nybegynder
14. april 2002 - 13:31 #9
da_nigga> Well, ingen grund til at forlange et svar ud af manden hvis han ikke ønsker at hjælpe. Men man kunne da håbe på at han så i det mindste havde forholdt sig en smule mere sagligt til problemet i stedet for.

Erik> Jeg ønsker hverken at du SKAL lave det for mig, det eneste jeg ønskede at opnå med spørgsmålet var en snak om metoder og muligheder. fordi 80% af eksperten består af folk der vil have lavet gratis arbejde og ikke gider løfte en finger selv, så behøves du ikke skære alle over en kam.

Med venlig Hilsen
Oscar Eg Gensmann
Avatar billede erikjacobsen Ekspert
14. april 2002 - 13:47 #10
Oscar: du har fået en snak om en mulighed. Ok?
da_nigga; hvad får dig til at tro at jeg ikke kender noget til .net?

Ja ja, jeg fik sagt noget i generelle vendinger, som kunne opfattes som
en skarp kritik af .net. Det var en "skrivefejl".

Tilbage til dagsordenen.
Avatar billede eeyore Nybegynder
22. april 2002 - 16:06 #11
Jeg er ikke sikker på, det er en god ide at tage hensyn til extension i regexp'en: Du er sandsynligvis ligeglad med extensionen, når det kommer til stykket - det, du egentlig bekymrer dig om er mime-typen... altså, du vil kun have typen text/html, f.eks. Så du bør kigge på den mime header, du får fra serveren for at finde ud af, om dokumentet er interessant.

mime-typen kan jo netop ikke bestemmes på extension (entydigt), af 2 grunde:

1) Visse url'er har ingen extension, http://www.cnn.dk/danmark - det er jo reelt set ikke til at
vide, om der gemmer sig et stylesheet eller et billede bag denne url!

2) Visse extensions er flertydige: F.eks. .php, .asp, you name it!, som siger noget om applikationstypen, men som ikke siger noget om de uddata, der bliver produceret - det kunne være html, billeder eller stylesheets.

Så brug mime headeren i stedet for at forsøge at bestemme mime typen ud fra extensionen'en :-)

MVH
eeyore
Avatar billede osaka_san Nybegynder
22. april 2002 - 16:08 #12
Hejsa Eeyone>

Mange tak for dine input - de er hermed noteret og vil blive taget til eftertragtning!

De Bedste Hilsner
Oscar Eg Gensmann
Avatar billede tson Nybegynder
23. april 2002 - 21:52 #13
Hejsa,

Her er et ruby program som henter alle a href links ud og udskriver alle url'erne. Selve regexet (/<a href=\"([^\"]*)\"/i) skulle være det samme i .NET.
Det kan banalt udvides til at tage en liste af gyldige extension, som f.eks:

/<a href=\"([^\"]*(\.html|\.jsp|\.osv))\"/i. Jeg støtter dog det råd du allerede har fået om at foretage processeringen i flere omgange, da store regex' nemt bliver ulæselige.

Regexet kan også gøres mere robust overfor hvilkårligt whitespace, ved at indsæte \s* hvor der må være 0 eller flere whitespace karakterer. Jeg har udeladt det af hensyn til læsbarhed.

Håber det kan bruges.

Thomas
#### RUBY SCRIPT:
#!/usr/bin/env ruby

$<.each_line {
  |line|
  puts $1 if line =~ /<a href=\"([^\"]*)\"/i
}
Avatar billede osaka_san Nybegynder
23. april 2002 - 21:59 #14
Er vist kommet til at lade dette spørgsmål stå længere end egentlig nødvendig :) - Jeg fiksede en regEx løsning for nogle dage siden der p.t. ser ud til at virke ganske fornuftigt.

Eftersom tson er den eneste der har svaret ryger pointene til ham :)

Mange tak for hjælpen og kommentarerne!

Med Venlig Hilsen
Oscar Eg Gensmann
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester