» »

parsanje podatkov iz strani

parsanje podatkov iz strani

bigbada ::

Zdravo.

Zanima me kako bi najlažje sparsal določene podatke iz neke strani? Recimo iz naslova www.imdb.com bi rad sparsal desno tabelo "Coming Soon" filme... Torej naslove. Kako se naj tega najlažje lotim, saj podobne stvari še nisem nikoli počel? Odprem "source" od strani in potem ven dobim? Kaj pa, če se source spreminja (v tem primeru mislim, da se ne). Ima kdo kakšen primer oz.bi znal pomagati? Delam pa v c#. Torej jaz si to predstavljam kot da iz tega dela sourca za stran pridobim ven naslove? Nekako bi moral dobiti zdaj ven naslove Deklinscina, Duhovnik,... A bi šlo to tako? Sploh nevem, če se prav lotevam ?
<h3>Coming Soon</h3>


<table class="list-table meter-arrow-table">

<tr valign="top">

    <td class="title">
        <a    onclick="(new Image()).src='/rg/SOON_1/HPRHS/images/b.gif?link=%2Ftitle%2Ftt1478338%2F';"     href="/title/tt1478338/"       >Dekliscina</a>
    </td>

    <td class="arrow">
        <img src="http://i.media-imdb.com/images/SF8a8f8b3c66e29942094eb05489ac3ab3/wheel/arrows/meter_up_arrow.gif" width="9" height="8" alt="Up" />
    </td>

    <td class="percent">
        <span >
            263%
        </span>
    </td>

</tr>



<tr valign="top">

    <td class="title">
        <a    onclick="(new Image()).src='/rg/SOON_2/HPRHS/images/b.gif?link=%2Ftitle%2Ftt0822847%2F';"     href="/title/tt0822847/"       >Duhovnik</a>
    </td>

    <td class="arrow">
        <img src="http://i.media-imdb.com/images/SF696d0921efe53c916590f4214d736157/wheel/arrows/meter_down_arrow.gif" width="9" height="8" alt="Down" />
    </td>

    <td class="percent">

        <span >
            39%
        </span>
    </td>
</tr>



hvala
lp

Spura ::

Parsaj kot xml (oziroma dostikrat to ni pravilen xml in rabis posebne knjiznjice za html parse). Potem se sprehajas po drevesu in pobiras vn podatke.

bigbada ::

Kako to misliš? Ni RSS feeda, da bi lahko parsal kot xml... Ali si mislil kaj drugega?

Spura ::

html je xml (ceprav slisim da se lahko napise html, ki ni pravilen xml - predno mi kdo skoci v lase).

commissar ::

Na ta način dobiš source:

  WebClient wc = new WebClient();
            var s = wc.DownloadString("http://www.imdb.com");


potem pa lahko sam v stringu poiščeš z kakšnim regexom, ali pa porabiš HtmlAgilityPack (.net lib za parsanje htmla v DOM)

lp

Trinitron ::

Tudi html je xml (vsaj približno). Poišči nek DOM parser za C# - sigurno obstaja, in potem v drevesni strukturi preprosto poiščeš "table.list-table td.title a".

Spura ::

Evo to. Html ki si ga prilepil zgoraj bi tudi navaden XML parser z lahkoto spremenil v DOM drevo. Ampak tale HTMLAgilityPack najbrz poskrbi tudi za izjeme tko da uporabi to.

bigbada ::

Zanima me kaj delam narobe:

 HtmlWeb hw=new HtmlWeb();
 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
 doc = hw.Load("http://www.imdb.com");

List<string> seznam = new List<string>();

string a = doc.DocumentNode.SelectSingleNode("//td[@class='title']").InnerText.ToString();
label1.Text = a;

Rad bi da mi v label izpise text ki se pojavi med znacko td class="title TLE NOT /td
Nek čuden error javi. A je problem v tem, da je v tej znacki se ena vgnezdena znacka??

commissar ::

uporabi metodo SelectNodes, ne SelectSingleNode
iz tega potem dobiš Seznam Nodov in greš čez njega in izpišeš.
Če ima td še podelemente lahko greš še v njih in izpišeš njihov tekst.

Pa napiši error, ki ga dobiš. Nima veze kolk je čuden.

bigbada ::

Javi mi ta error:
An unhandled exception of type 'System.NullReferenceException' occurred in html Project.exe

Additional information: Object reference not set to an instance of an object.

zdaj sem probal tako, pa še vedno isti error

  HtmlWeb hw=new HtmlWeb();
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc = hw.Load("http://www.imdb.com");

           HtmlNodeCollection seznam = doc.DocumentNode.SelectNodes("//td[@class='title']");
           foreach (HtmlNode node in seznam)
           {
               listBox1.Items.Add(node);
           }

V tem primeru bi mi vsaki nod iz seznama moralo vstavit v listbox, ki ga imam na formi...

bigbada ::

           List<string> bb = new List<string>();
           HtmlNodeCollection seznam = doc.DocumentNode.SelectNodes("//td[@class='title']");

           foreach (HtmlNode node in seznam)
           {
               string a = node.InnerText.ToString();
               bb.Add(a);
           }

           foreach (string s in bb)
           {
               //listBox1.Items.Add(s).ToString();
               MessageBox.Show(s);
           }

Zanima me zakaj mi teh stringov noče loadat v listbox? Messagebox mi ga izpiše. Ko pa hoče v listbox pa javi že prej podani error...

EDIT: Sem že rešil...

Zgodovina sprememb…

  • spremenilo: bigbada ()

keworkian ::

Rajše si napiši svoj regex pa potem dobi ven, jaz sem naredu isto.

bigbada ::

Imam eno težavo. Zdaj mi selecta vse node k imajo td class="title". Jaz bi pa rad, da mi samo določene, ki se nahajajo med dvema drugima nodoma (med table class="blabla"..../table)? Kako naj to naredim?

Poskusil sem tle not vstaviti:
doc.DocumentNode.SelectNodes("//table[@class='blabla']/td[@class='title']");
ampak ne deluje. Niti nič dokumentacije ne najdem kako se sploh uporabljajo tile // pa /. Mogoče kdo ve?

EDIT: REŠIL :S

Zgodovina sprememb…

  • spremenilo: bigbada ()

commissar ::

na teli ( http://www.w3schools.com/xpath/xpath_sy... ) strani si malo poglej kako xpath sploh deluje. Vendar pazi, htmlagilitypack ne podpira celotne specifikacije

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Davčne blagajne (strani: 1 2 3 424 25 26 27 )

Oddelek: Programiranje
1344333266 (73269) Macketina
»

E-račun

Oddelek: Programiranje
217492 (4255) ivanhoe5x
»

[Java]Shranjevanje/Branje nastavitev za povezavo z podatkovno bazo

Oddelek: Programiranje
192636 (2410) KernelPanic
»

c# html parsanje - s cim? - HtmlAgilityPack mogoce??

Oddelek: Programiranje
71228 (1094) commissar
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134343 (1423) Mrch

Več podobnih tem