Avatar billede webcreator Nybegynder
07. februar 2005 - 20:37 Der er 22 kommentarer og
2 løsninger

Regular Expression - træk data ud fra HTML

Hej Eksperter.

Jeg forsøger så godt jeg kan, at lære brugen af Regular Expressions, men jeg synes ikke at have helt styr på det.

Jeg har nedenstående HTML kode :

<div><span class='udsendelse-tid'>23:10</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22172846);'>Overskriften står her</span></div>

Jeg ønsker at få fat i teksten "Overskriften står her". Så vidt jeg ved, kan man angive en start- og sluttekst, hvilket gøres med ^ (start) og $ (slut). Jeg har så prøvet følgende :

^[<div><span>][</div></span>]$

Ovenstående burde vel give mig hele ovenstående tekst. Men det virker ikke. Og jeg er også kun interesseret i "Overskriften står her". Hvordan får jeg det?
Avatar billede arne_v Ekspert
07. februar 2005 - 20:50 #1
using System;
using System.Text.RegularExpressions;

class MainClass
{
    public static void Main(string[] args)
    {
        test("<div><span class='udsendelse-tid'>23:10</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22172846);'>Overskriften står her</span></div>");
    }
    private static void test(string s)
    {
        MatchCollection res = Regex.Matches(s,"(?:<span [^>]*>)(.*?)(?:</span>)");
        for(int i = 0; i < res.Count; i++) {
            Console.WriteLine(res[i].Groups[1]);
        }
    }
}

udskriver

23:10
Overskriften står her
Avatar billede jensgram Nybegynder
07. februar 2005 - 20:51 #2
Jeg ville forsøge mig med noget lign.:


<span [^>]*?class=['"]udsendelses-titel['"'][^>]*?>(.*?)</span></div>$
Avatar billede jensgram Nybegynder
07. februar 2005 - 20:52 #3
... og dér havde Arne så været der :(
Avatar billede webcreator Nybegynder
07. februar 2005 - 20:55 #4
Oh, ok. Jeg kigger lige på det :)
Avatar billede webcreator Nybegynder
07. februar 2005 - 21:05 #5
Hvad kan jeg gøre, hvis jeg har flere linier af ovenstående html-kode? Er det nemmeste at smide det i en tekst-fil og så læse en linie af gangen, eller kan man smide flere overskrifter ind i et array eller lignende (evt. vha. split)
Avatar billede arne_v Ekspert
07. februar 2005 - 21:08 #6
Min kode kan finde lige så mange span direktiver som det skal være i en
enkelt streng, så en lang streng er helt fint.
Avatar billede webcreator Nybegynder
07. februar 2005 - 21:55 #7
Hm, jeg får desværre ikke hvad jeg vil. Men det er heller ikke en helt nem opgave. HTML'en ser sådan ud :
Avatar billede webcreator Nybegynder
07. februar 2005 - 21:56 #8
<div class='udsendelse'>
<div><span class='udsendelse-tid'>23:45</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22164522);'>Onsdags Lotto</span></div>
<div class='udsendelse-beskrivelse' style='display: block;' name='divBeskrivelseKort' id='Desc22164522Short'>Måske bliver du onsdagsmillionær.</div>
<div class='udsendelse-beskrivelse' style='display: none;' name='divBeskrivelseLang' id='Desc22164522Long'>Måske bliver du onsdagsmillionær.<br>  <div align='right' style='margin-top:2px;'>  <a href='/paamindelser/' target='_top'><img src='/images/paamind_inaktiv.gif' border='0' alt='Påmindelse' title='For at benytte påmindelser skal du være TV2 Login bruger'> <span title='For at benytte Påmindelser skal du være TV2 Login bruger' class='program_ikon_inaktiv'>Påmindelse</span></a>  <a href='/tvuge/' target='_top'><img src='/images/tvuge_inaktiv.gif' border='0' alt='tv-uge' title='For at benytte tv-ugen skal du være TV2 Login bruger'> <span title='For at benytte tv-ugen skal du være TV2 Login bruger' class='program_ikon_inaktiv'>tv-uge</span></a>  </div>

</div>
</div>
<div class='udsendelse'>
<div><span class='udsendelse-tid'>23:50</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22164523);'>Arbejdsliv - for klog til et arbejde?</span> <span class='udsendelse-symboler'>(TTV)</span> <span class='udsendelse-symboler'>(12)</span></div>
<div class='udsendelse-beskrivelse' style='display: block' name='divBeskrivelseKort' id='Desc22164523Short'><img src='http://inc.tv2.dk/images/dummy.gif' height='1' width='1'></div>
<div class='udsendelse-beskrivelse' style='display: none;' name='divBeskrivelseLang' id='Desc22164523Long'>Vi får at vide, at vi skal uddanne os for at klare os i den globaliserede verden. Der er bare det problem, at dem, der uddanner sig, ikke kan få noget arbejde. Over hver tredje akademiker har ikke noget job et år efter eksamen. Vi følger de unges umulige kamp for at få et arbejde og ser på, hvad der er gået galt. www.dr.dk/arbejdsliv.<br>Sendes også 13.2.<br>  <div align='right' style='margin-top:2px;'>  <a href='/paamindelser/' target='_top'><img src='/images/paamind_inaktiv.gif' border='0' alt='Påmindelse' title='For at benytte påmindelser skal du være TV2 Login bruger'> <span title='For at benytte Påmindelser skal du være TV2 Login bruger' class='program_ikon_inaktiv'>Påmindelse</span></a>  <a href='/tvuge/' target='_top'><img src='/images/tvuge_inaktiv.gif' border='0' alt='tv-uge' title='For at benytte tv-ugen skal du være TV2 Login bruger'> <span title='For at benytte tv-ugen skal du være TV2 Login bruger' class='program_ikon_inaktiv'>tv-uge</span></a>  </div>

</div>

Det eneste jeg er interesseret i, er tidspunkt, overskrift og beskrivelse.
Avatar billede webcreator Nybegynder
07. februar 2005 - 21:56 #9
(koden er nemmere at overskue i notepad ; www.powerzone.dk/source.txt
Avatar billede arne_v Ekspert
07. februar 2005 - 21:58 #10
Et match per forekomst af alle 3 og en expression som fanger alle 3 !
Avatar billede webcreator Nybegynder
07. februar 2005 - 22:04 #11
Sorry? Hvad mener du? Er det løsningen eller hvad?
Jeg er lidt lost i det her.

?:<span [^>]*>)(.*?)(?:</span>  <== Hvorfor skal der fx ?: først?

Kan du lave en reg der giver mig det jeg har brug for mon?
Avatar billede arne_v Ekspert
07. februar 2005 - 23:14 #12
?: betyder "data skal være der men vi er ikke interesseret i det"
Avatar billede arne_v Ekspert
07. februar 2005 - 23:15 #13
Jeg forstår ikke præcis hvad der er du vil have fisket ud af det HTML.
Avatar billede webcreator Nybegynder
07. februar 2005 - 23:27 #14
Af den kode jeg henviste til, ønsker jeg at kunne hente :
'23:45', 'Onsdags Lotto', 'Måske bliver du onsdagsmillionær.'
'23:50', 'Arbejdsliv - for klog til et arbejde?', 'Vi får at vide, at vi skal uddanne os for at klare os i den global..<fortsættes>..'
Avatar billede arne_v Ekspert
07. februar 2005 - 23:37 #15
using System;
using System.Text.RegularExpressions;

class MainClass
{
    public static void Main(string[] args)
    {
        test(@"<div class='udsendelse'>
<div><span class='udsendelse-tid'>23:45</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22164522);'>Onsdags Lotto</span></div>
<div class='udsendelse-beskrivelse' style='display: block;' name='divBeskrivelseKort' id='Desc22164522Short'>Måske bliver du onsdagsmillionær.</div>
<div class='udsendelse-beskrivelse' style='display: none;' name='divBeskrivelseLang' id='Desc22164522Long'>Måske bliver du onsdagsmillionær.<br>  <div align='right' style='margin-top:2px;'>  <a href='/paamindelser/' target='_top'><img src='/images/paamind_inaktiv.gif' border='0' alt='Påmindelse' title='For at benytte påmindelser skal du være TV2 Login bruger'> <span title='For at benytte Påmindelser skal du være TV2 Login bruger' class='program_ikon_inaktiv'>Påmindelse</span></a>  <a href='/tvuge/' target='_top'><img src='/images/tvuge_inaktiv.gif' border='0' alt='tv-uge' title='For at benytte tv-ugen skal du være TV2 Login bruger'> <span title='For at benytte tv-ugen skal du være TV2 Login bruger' class='program_ikon_inaktiv'>tv-uge</span></a>  </div>

</div>
</div>
<div class='udsendelse'>
<div><span class='udsendelse-tid'>23:50</span>&nbsp;&nbsp;<span class='udsendelse-titel' onclick='toggleDesc(22164523);'>Arbejdsliv - for klog til et arbejde?</span> <span class='udsendelse-symboler'>(TTV)</span> <span class='udsendelse-symboler'>(12)</span></div>
<div class='udsendelse-beskrivelse' style='display: block' name='divBeskrivelseKort' id='Desc22164523Short'><img src='http://inc.tv2.dk/images/dummy.gif' height='1' width='1'></div>
<div class='udsendelse-beskrivelse' style='display: none;' name='divBeskrivelseLang' id='Desc22164523Long'>Vi får at vide, at vi skal uddanne os for at klare os i den globaliserede verden. Der er bare det problem, at dem, der uddanner sig, ikke kan få noget arbejde. Over hver tredje akademiker har ikke noget job et år efter eksamen. Vi følger de unges umulige kamp for at få et arbejde og ser på, hvad der er gået galt. www.dr.dk/arbejdsliv.<br>Sendes også 13.2.<br>  <div align='right' style='margin-top:2px;'>  <a href='/paamindelser/' target='_top'><img src='/images/paamind_inaktiv.gif' border='0' alt='Påmindelse' title='For at benytte påmindelser skal du være TV2 Login bruger'> <span title='For at benytte Påmindelser skal du være TV2 Login bruger' class='program_ikon_inaktiv'>Påmindelse</span></a>  <a href='/tvuge/' target='_top'><img src='/images/tvuge_inaktiv.gif' border='0' alt='tv-uge' title='For at benytte tv-ugen skal du være TV2 Login bruger'> <span title='For at benytte tv-ugen skal du være TV2 Login bruger' class='program_ikon_inaktiv'>tv-uge</span></a>  </div>

</div>");
    }
    private static void test(string s)
    {
        MatchCollection res = Regex.Matches(s,"(?:<(?:span|div) class=')([^']*)(?:'[^>]*>)([^<]*)(?:</(?:span|div)>)");
        for(int i = 0; i < res.Count; i++) {
            Console.WriteLine(res[i].Groups[1] + " = " + res[i].Groups[2]);
        }
    }
}
Avatar billede arne_v Ekspert
07. februar 2005 - 23:37 #16
udsendelse-tid = 23:45
udsendelse-titel = Onsdags Lotto
udsendelse-beskrivelse = Måske bliver du onsdagsmillionær.
udsendelse-tid = 23:50
udsendelse-titel = Arbejdsliv - for klog til et arbejde?
udsendelse-symboler = (TTV)
udsendelse-symboler = (12)
Avatar billede webcreator Nybegynder
08. februar 2005 - 15:57 #17
Se, det er netop ovenstående der er problemet. Jeg skal vide hvor de forskellige data er i array'et, men det kan jeg ikke beregne mig frem til, når der pludselig står (TTV) i stedet for en beskrivelse.
Avatar billede webcreator Nybegynder
08. februar 2005 - 16:05 #18
Nej, det er faktisk (12) der er problemet, ikke (TTV)
Avatar billede webcreator Nybegynder
08. februar 2005 - 16:12 #19
Det er i øvrigt data'et fra flg. side jeg er interesseret i:
http://tv.powerzone.dk (tidspunkt, overskrift, beskrivelse)
Avatar billede webcreator Nybegynder
08. februar 2005 - 16:13 #20
- og så kunne det være rigtig lækkert, hvis dataet kunne blive smidt i 3 ArrayLists så jeg bare kan skrive :

tid[0]
overskrift[0]
beskrivelse[0]

- og skulle en beskrivelse mangle, indsættes blot en tom plads.
Avatar billede arne_v Ekspert
08. februar 2005 - 20:27 #21
Det er altså ikke svært at putte res[i].Groups[2] ind i ArrayLists udfra
res[i].Groups[1]
Avatar billede webcreator Nybegynder
09. februar 2005 - 22:14 #22
Jeg er kommet frem til en anden løsning, som fungerer rigtigt efter hensigten. Jeg må vente et halvt års tid, til vi får rigtig undervisning i regular expressions.

arne > Smid blot et svar alligevel - så deler vi i porten :)
Avatar billede arne_v Ekspert
09. februar 2005 - 22:15 #23
ok
Avatar billede webcreator Nybegynder
09. februar 2005 - 23:20 #24
:)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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