Söka-i-string-problem (html-kod i C++)

Permalänk
Hedersmedlem

Söka-i-string-problem (html-kod i C++)

Jo, jag försöker få tag på URL:en till en länk i HTML.
Formatet är såhär:
<A HREF="b/blabla.html">BLABLA</A><BR><BR>
"blabla" har jag som en char* så det är ju lätt att få dit b:et.
Men.
Såna här länkar finns det 10-150 på varje "sida", som jag också lagrar i en char*.
Jag ska alltså få tag på den rätta URL:en för (t ex) "blabla". Ännu ett problem är dock att vissa, kanske 1 av 15 länkar inte bara har x/ utan en hel URL med http:// och så vidare. Om nån bara hjälper mig att få ut själva url:en så kan jag kolla efter sånt och connecta dit och så vidare själv.
Hjälp uppskattas (om nån förstår mig såhär dags ).

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

#include <iostream> #include <cstdio> #define TESTING using namespace std; int FetchLinks(char *buffer, char* mainurl); int main() { char HtmlBuffer[65536]; FILE* fp; fp = fopen("index2.htm","r"); if(fp == NULL) { cout << "Failed: Couldn't open file!"; return 0; } fread(HtmlBuffer,sizeof(char),65536,fp); FetchLinks(HtmlBuffer,"http://freshmeat.net/"); fclose(fp); return 0; } int FetchLinks(char *buffer, char* mainurl) { char *pBuffer; char LinkArray[1024][256]; int i = 0; int j = 0; int h = 0; pBuffer = strstr(buffer,"href="); if(pBuffer == NULL) { cout << "Didn't find any occurrances\n"; return 0; } for(;;) { pBuffer = strstr(pBuffer,"href="); if(pBuffer == NULL) { break; } pBuffer+=5; if(*pBuffer == '\"') { pBuffer++; } if(*pBuffer == '>') { break; } if(*pBuffer == ' ') { break; } if(*pBuffer == '#') { LinkArray[i][0] = '\0'; strcat(&LinkArray[i][0],mainurl); j += strlen(mainurl); //break; } if(*pBuffer == '?') { //break; } if(*pBuffer == '/') { pBuffer++; LinkArray[i][0] = '\0'; strcat(&LinkArray[i][0],mainurl); j += strlen(mainurl); } while(*pBuffer != '>' && *pBuffer != ' ') { #ifdef TESTING if(*pBuffer == '\"') { pBuffer++; if(*pBuffer == '>') { break; } if(*pBuffer == ' ') { break; } if(*pBuffer == '#') { LinkArray[i][0] = '\0'; strcat(&LinkArray[i][0],"http://freshmeat.net/"); j += strlen("http://freshmeat.net/"); //break; } if(*pBuffer == '?') { //break; } if(*pBuffer == '/') { pBuffer++; LinkArray[i][0] = '\0'; strcat(&LinkArray[i][0],"http://freshmeat.net/"); j += strlen("http://freshmeat.net/"); } } #endif LinkArray[i][j] = *pBuffer; pBuffer++; j++; } LinkArray[i][j] = '\0'; i++; j=0; } cout << "Found " << i << " links.\n\n"; //for(j=0;j < i; j++) if((strstr(&LinkArray[j][0],".jpg"))) cout << &LinkArray[j][0] << endl; //for(j=0;j < i; j++) if((strstr(&LinkArray[j][0],".gif"))) cout << &LinkArray[j][0] << endl; for(j=0;j < i; j++) cout << &LinkArray[j][0] << endl; delete pBuffer; return 0; }

Fulhack. Väldigt äcklig kod.

Du får helt enkelt specificera vilken site det gäller
typ skriva in http://hund.net/
Detta är väldigt äcklig kod, okommenterad och jävlig, men den fungerar iaf

Permalänk
Hedersmedlem

Hm tack för att du hjälper till iaf
Om jag ska vara ärlig så tog jag en annan metod som blev lättare, men jag använde vissa saker ändå.

Nu har jag ett annat problem. Vet inte om jag ska fixa en ny tråd, men jag tar den här "så länge"...
Jag har en funktion, som tar emot bland annat två pointers.

Såhär, ungefär (har inte tagit med hela funktionen)

bool StripHTML(const char *start, const char *end, char *CleanBuf, int bufsize) // start och end ska vara minnesadresser, CleanBuf en buffer med storleken 'bufsize' där allt lagras sen { size_t i = 0; char *pCBuf = CleanBuf; char *buf = new char[16384]; memset(buf, '\0', 16384); char *ptr = buf; while (&start != &end) // vad ska jag göra här egentligen? { if (*start) *ptr = *start; else break; ptr++, start++; } *ptr = '\0';

Själva HTML-delen funkar rätt bra (tar bort allt mellan <> själva taggarna). Men, den här lilla delen funkar inte som den ska. Den tar med hela skiten (från start till slutet, INTE 'end') istället för att stanna där den ska. Jag har provat många saker, men inte då.
Nån som vill försöka lite?
Jag behöver inte lika mycket kod som ovan dock.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Hur gjorde du istället?
I need to know!
heheh. jag förstår inte riktigt vad du vill göra här heller.

Permalänk
Hedersmedlem

Jag struntade i att kolla i länkarna på det där viset. Istället tog jag strängen jag hade, tog bort alla icke-bokstäver och la till '.html'.

Det jag vill göra nu, ungefär...
char str[] = "0123456789";
char *start = strstr(str, "1");
char *end = strstr(str, "8");

Nu har jag pekare i början och slutet av det jag vill ha (1-8). Jag vill spara det här i en buffer, alltså det som är "mellan" pekarna.
Edit: Nu insåg jag hur otydlig jag var i första inlägget. Skyller på att jag är trött...
Edit2: Det är uppenbarligen ett exempel.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Hehe
vill du bara kopiera in den strängen i en annan?
Eller vill du kopiera varje char för sig in i en array?

Permalänk
Hedersmedlem

Nu förstår jag inte riktigt vad du menar istället.

Igen då:

bool *blah (char *start, char *end, char *result, int bufsize) { // start pekar nånstans mitt i en sträng ('buf' i en annan funktion, allokerad med new char[] // end pekar 1-15kB längre "ner" i den // jag vill spara allt mellan i result, som redan är allokerad med new char[bufsize] return true; }

Nåt sånt? Jag får försöka mer själv om ingen förstår

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200