Parsowanie html - sscanf

0

Witam.

Mam taki problem. Chcę parsować konkretną treść ze źródła pewnej strony html, które mam w buforze. Konkretnie chodzi mi o to co się znajduję między tagami.

<meta name="title" content="[to chcę parsować]">

Ale nie wiem jak to zrobić. Próbowałem tak:

sscanf(buffor, "<meta name=\"title\" content=\"%[^\"]\"", title);

ale nie wychodzi. Proszę o pomoc. Najlepiej jakby to było za pomocą sscanf().

Dzięki.</cpp>

0

Hmm... o ile wiem, sscanf nie obsluguje regexp'ów.

Hmm... a nie latwiej po prostu przeiterowac po stringu i "recznie" wyciagnac te dane ?

0

No z tego co ja wiem, to się jednak obsługuje :) Nie wiem tylko jak z tego przykładu wyciągnąć to co jest w tych tagach. Nie wiem czemu nie działa, a wolałbym uniknąć korzystania z dodatkowych bibliotek dlatego zależy mi aby to było za pomocą sscanf().

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

0

Wskaż mi gdzie na tej stronie, której URL zamieściłeś, jest napisane, że sscanf obsługuje RegExpy=RegularExpressions=wyrażenia regularne? :)
On (a raczej jego niektóre implementacje) tylko obsługuje drobną część, np. klasy znakow..

sprawdz, czy Twoja implementacja w ogole je obsluguje! jesli nie - to znaczy ze %[^ potraktowało po prostu jako zwykle znaki, a nie ciag sterujacy.

0

Traktuje dobrze, jako ciąg :)

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{

	char string[] = "<meta name=\"title\" con=\"coscos\">";
	char tmp[16];
	
	sscanf(string, "<meta name=\"title\" con=\"%[^\"]\"", tmp);
	printf("%s\r\n", tmp);

	return 0;

}

Chyba zrobię to tak, że podzielę za pomocą strtok() i będę sprawdzał czy w danej linijce jest ta sekwencja, jeśli tak, to będę ją parsował :) </cpp>

0

Ook.. mógłbyś wyelaborować w czym w takim razie jest problem? Jezeli sscanf rozumie %["] to jaki masz problem z wyciagnieciem tego 'coscos'? Abstrahujac od braku limitu (%15), to trogram powyzej wyglada na tyle poprawnie ze cokolwiek powinien wypisac - co wypisał, jesli nie 'coscos' ?

0
char *pch;
pch = strtok(buffor, "\n");

while(pch != NULL)
{

	if((string(pch).find("<meta name=\"title\"")) != string::npos)
	{
	
		sscanf(pch, "		<meta name=\"title\" content=\"%[^\"]\"", title);
		printf("%s\n", title);
		break;

	}

	pch = strtok(NULL, "\n");

}

Tak to rozwiązałem. Otóż najważniejsze były te dwa tabulatory na początku formy. Myślałem że da się je obejść wstawiając na początku %*s, lecz nie. Wszystko hula, pozdrawiam.</cpp>

edit

Oczywiście nie zauważyłem :)

To

sscanf(pch, "		<meta name=\"title\" content=\"%[^\"]\"", title);

krócej będzie jako

sscanf(pch, "%*[^<]<meta name=\"title\" content=\"%[^\"]\"", title);

Pozdrawiam, dziękuje za wszystkie odp.</cpp></cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1