HTML Parser sau Expresii Regulate




Extrag informatie dintr-o pagina si ma intreb cum anume sa procedez. Sa folosesc expresii regulate sau un parser html. Norocul meu e ca am gasit unul deja implementat de un anume tip Alex Chudnovsky, iar .Net imi ofera suport si pentru expresii regulate.

Am luat ca test prima pagina a sitului ejobs, din care vreau sa extrag lista de orase din tagul HTML select.



<select name="oras" class="input12" style="width:130px;" >
<option value="">Toate orasele</option>
<option value="262" >Abrud</option>
...
<option value="298" >Zlatna</option>
</select>

Expresii Regulate
Am avut nevoie de doua expresii regulate. Una pentru a extrage toate tagurile <option></option> din acel <select>

(?<selectOrasInput> // constructie pentru a marca grupul in RegExp
<select //inceput de tag
((?:.|\n)*?) //orice intre tag si atributul name
name=\"oras\" //atributul name trebuie sa aiba valoarea oras
((?:.|\n)*?)
>
(?<options>(?:.|\n)*?) // marchez grupul cu de optiuni
</select>
)

...si una pentru a extrage valoarea si textul din optiune

value=\"(?<Value>(?:.|\n)*?)\" // value=" 262"
(?:.|\n)*?
>(?<Text>(?:.|\n)*?)</option> // > Abrud</option>





HTML Parser

while ((oChunk = HtmlParserMajestic.ParseNext()) != null) // parse all html
{
if (oChunk.GetParamValue("name") == "oras") // parser on select node
{
while ((oChunk = HtmlParserMajestic.ParseNext()) != null) // parse first option
{
if (oChunk.sTag == "select" && oChunk.oType == HTMLchunkType.CloseTag)
break; // exit from parsing options
if (oChunk.sTag == "option" && oChunk.oType == HTMLchunkType.OpenTag)
{
option = new SelectOption();
option.Value = oChunk.GetParamValue("value"); // get value
oChunk = HtmlParserMajestic.ParseNext(); // parse to text
option.Text = oChunk.oHTML.Trim(); // get text
oChunk = HtmlParserMajestic.ParseNext(); // parse to end tag
citiesFromParser.Add(option); // add new option
}
}
}
}

Din ce am testat, expresiile regulate sunt pana la 8, 9 ori mai lente decat parserul HTML( 125 milisecunde expresiile, 15 milisecunde parserul). Daca as vrea sa extrag numere de telefon, emailuri, date calendaristice din textul paginii HTML, parserul nu-mi poate fi de folos decat pana la un anumit punct sau deloc, dar folosind expresii regulate, le pot obtine cu siguranta.



Download Source Code And Play

Comments

  1. Noroc ash vrea sa aflu ce fel de proecte ai facut in ultima vreme si daca vrei poti vedea blogul meu csbeginner.blogspot.com

    ReplyDelete
  2. salut..
    acum lucrez la doua proiecte, un fel de spider si un fel de e-shop.. simplu.. asp .net, C#.. un SQL

    mai am niste proiecte pe coada.. dar acolo prestez mai putin

    ReplyDelete

Post a Comment

Popular posts from this blog

IIS 7.5, HTTPS Bindings and ERR_CONNECTION_RESET

Verify ILogger calls with Moq.ILogger

Table Per Hierarchy Inheritance with Column Discriminator and Associations used in Derived Entity Types