Avatar billede superjma Nybegynder
26. oktober 2005 - 19:17 Der er 12 kommentarer og
1 løsning

Tekstsøgning

Jeg skal gennemløbe en html-fil og hive visse data ud af denne.

Problemet er hvordan jeg gør dette lettest.

Jeg har kigget lidt på fscanf men har lidt svært ved at se hvordan jeg finder mønstre som jeg kan søge efter.

Håber der er nogen der har prøvet noget lign. før og kender en løsning til problemet.
Avatar billede arne_v Ekspert
26. oktober 2005 - 19:36 #1
XHTML => få fat i en XML parser og så kører det bare

HTML med alle mulige ikke W3C valide konstruktioner => masser af kode arbejde

afhængig af hvd du henter ud kan du bruge noget helt manuelt parse eller
satse på brug ef regexp
Avatar billede superjma Nybegynder
26. oktober 2005 - 19:52 #2
Er det noget du kan give et eksempel på?
Der er flere og flere sider som er xhtml. Ex. "http://www.cse.dk/kf"

Men der er selvf. også stadig nogen det ikke vil virke med ex. http://www.betbrain.com/viewer/Football-Denmark-SAS_Ligaen_2005_2006/focus/tn/1464428/sportId/1/site/0

Kunne man evt. ikke lave noget med "find denne dette" og "dette" og "dette" så hent værdien af variablen mellem "<table><tr><td>" og "</td></tr></table>" på næste linie?
Avatar billede arne_v Ekspert
26. oktober 2005 - 20:49 #3
jo det lyder som noget regexp kan bruges til
Avatar billede superjma Nybegynder
26. oktober 2005 - 21:29 #4
Jo! Præcis min tanke.. problemet er blot hvordan?
Jeg har forsøgt mig med at teste lidt udfra kode jeg har tidligere indlæg om ca. samme emne at få fundet frem til noget der virker. Men det er ikke rigtigt lykkedes mig. Måske fordi jeg intet aner om regex.

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
//  re = pcre_compile("^((:[0-9]+/)?)",0,&error,&erroffset,NULL);

    re = pcre_compile("^*(?P<body>[^:]+)^*:(?P<value>.*?)^*$",0,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    if(rc < 0)
    {
        printf("%s does NOT contain a html\n",s);
    }
    else
    {
        pcre_get_substring(s,ovector,rc,1,&p);
        printf("%s does contain html and it is %s\n",s,p);
    }
}

int main()
{
    test("<html>\n<body>\ntester\n</body></html>");
    test("dfdf0/test sdfsaf");
    return 0;
}

Problemet er at ingen af dem virker. regex'en fandt jeg frem til her http://www.amk.ca/python/howto/regex/ (godt nok python men regex er vel regex)
Avatar billede superjma Nybegynder
26. oktober 2005 - 21:31 #5
Det jeg mente var at det kan kompilere og finde tal mv. men ikke fortælle mig om linien indeholder <body> samt måske endnu mere relevant hvad der i givet fald står mellem <body> og </body>
Avatar billede arne_v Ekspert
27. oktober 2005 - 18:20 #6
#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    re = pcre_compile("(?:^<html>\\s<body>\\s)(.*)(?:</body></html>$)",PCRE_CASELESS+PCRE_DOTALL+PCRE_MULTILINE,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    if(rc < 0)
    {
        printf("%s does NOT contain a html body\n",s);
    }
    else
    {
        pcre_get_substring(s,ovector,rc,1,&p);
        printf("%s does contain a html body and it is %s\n",s,p);
    }
}

int main()
{
    test("<html>\n<body>\ntester\n</body></html>");
    test("dfdf0/test sdfsaf");
    return 0;
}
Avatar billede superjma Nybegynder
27. oktober 2005 - 19:34 #7
SUPER tak for det.

Det kunne dog være rart at vide hvad der sker.. eller rettere HVORFOR det virker.. det er nemlig lidt sort snak for mig sådan noget regex.

Det kunne også være rart at vide om den søger hele strengen.
Det jeg er kommet frem til der matcher perfekt er flg.
re = pcre_compile("(?:^(.*)<body>)(.*)(?:</body>)",PCRE_CASELESS+PCRE_DOTALL+PCRE_MULTILINE,&error,&erroffset,NULL);

Jeg har også lige et kort spg. ang. startoffset er det ikke hvilket tegn den skal begynde at søge fra? Det kan jeg ikke få til at virke. Ville ellers passe perfekt såfremt man kunne gemme pos. for første forekomst i en var og derefter starte næste søgning fra dette punkt.

int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize);
Avatar billede arne_v Ekspert
27. oktober 2005 - 19:39 #8
re = pcre_compile("(?:<body>)(.*)(?:</body>)",PCRE_CASELESS+PCRE_DOTALL+PCRE_MULTILINE,&error,&erroffset,NULL);

virker nok lige så godt
Avatar billede arne_v Ekspert
27. oktober 2005 - 19:40 #9
(?:<body>) = strengen <body> som bare skal smides væk

(.*) = 0-mange tegn som vi skal bruge

(?:</body>) = strengen </body> som bare skal smides væk
Avatar billede arne_v Ekspert
27. oktober 2005 - 19:42 #10
jo det må start offset være

virker der ikke ?
Avatar billede arne_v Ekspert
27. oktober 2005 - 19:42 #11
og et svar
Avatar billede superjma Nybegynder
27. oktober 2005 - 20:13 #12
Tusind tak.. det hjalp på forståelsen.. nu kan jeg endlige komme videre med at lære noget C og regex.

Nope..

test("<html><header></header>\nsadf<body>tester</body></html>");
og
test("<html><header></header><body>tester</body></html>");

Giver begge et offset på 2!!!

Men der er point;)
Avatar billede arne_v Ekspert
27. oktober 2005 - 20:28 #13
følgende virker fint:

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    int ix;
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    re = pcre_compile("(?:<body>)(.*?)(?:</body>)",PCRE_CASELESS+PCRE_DOTALL+PCRE_MULTILINE,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    ix = 0;
    while((rc = pcre_exec(re,NULL,s,strlen(s),ix,0,ovector,sizeof(ovector)/sizeof(int)))>0)
    {
      pcre_get_substring(s,ovector,rc,1,&p);
      printf("%s\n",p);
      ix = ovector[1];
    }
}

int main()
{
    test("<body>1</body>");
    test("<body>1</body><body>2</body>");
    test("<body>1</body><body>2</body><body>3</body>");
    return 0;
}
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