Kom ihåg mig?
Home Menu

Menu


HtmlAgilityPack - hämta specifika element

 
Ämnesverktyg Visningsalternativ
Oläst 2008-10-31, 12:10 #1
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
Tjänare!

Nu har man börjat på WN också, här verkar det vara en trevlig stämning i trådarna!

Jag jobbar just nu med ett projekt där jag vill hämta artiklar från Wikipedia och presentera text på min webbplats. Jag använder följande kod för att hämta data från HTTP för att senare ladda in datan i ett HtmlDocument och tillslut konvertera till XDocument:

Kod:
        HtmlWeb document = new HtmlWeb();
        string url = "http://en.wikipedia.org/wiki/Manchester_united";
        Uri uri = new Uri(url);

        HtmlDocument doc = document.Load(url);

        var XDoc = doc.ToXDocument();

        XDoc.Save(Server.MapPath("output.xml"));
ToXDocument() är en extension method som jag själv adderat till namespace:t. Den ser ut som följer:

Kod:
  public static class HtmlDocumentExtensions
  {
    public static XDocument ToXDocument(this HtmlDocument document)
    {
      using (StringWriter sw = new StringWriter())
      {
        document.OptionOutputAsXml = true;
        document.Save(sw);
        return XDocument.Parse(sw.GetStringBuilder().ToString());
      }
    }
  }
Som ni ser så sparar jag ned filen för att se vad den returnerar och på så sätt hämta ut det jag vill från dokumentet, d.v.s. texten, informationen om - i detta fall - Manchester United. Det som returneras i "output.xml" är just nu följande:

http://aspsidan.se/code/default.asp?c=23755

Är det någon själ här inne som har egna erfarenheter av HtmlAgilityPack som kan hjälpa mig iterera genom dokumentet för att hitta det jag söker? Det krävs kanske bara ett litet exempel. Just nu ser ju inte outputen ut som en XML-fil vilket förvirrar mig. För på rätt spår är jag väl?
peterbf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-31, 14:09 #2
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
Jag har inte jobbat med just HtmlAgilityPack men du hämtar ju bara htmlfilen och sparar den. Strukturen i html-filen kan, strukturmässigt, ses som en xml-fil och jag antar att det ger samma åtkomst.
Jag tror inte att det sker någon som helst konvertering till ett mer "ren" xml varav din förvirring
allstars är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-31, 15:11 #3
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
Ok. Då är det uppklarat.

Hur itererar jag nu genom detta dokument för att hitta specifika element?
peterbf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-31, 15:20 #4
icehole icehole är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2004
Inlägg: 411
icehole icehole är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2004
Inlägg: 411
tror du borde kolla igenom regler för vad som gäller ang. att ta deras text och visa på din egna sida. så att du inte råkar illa ut
icehole är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-31, 15:42 #5
nord84s avatar
nord84 nord84 är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 229
nord84 nord84 är inte uppkopplad
Medlem
nord84s avatar
 
Reg.datum: Dec 2004
Inlägg: 229
icehole > Det är helt ok så länge man uppger källan..
nord84 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-31, 18:03 #6
Daniel.sts avatar
Daniel.st Daniel.st är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2006
Inlägg: 762
Daniel.st Daniel.st är inte uppkopplad
Mycket flitig postare
Daniel.sts avatar
 
Reg.datum: Jul 2006
Inlägg: 762
Citat:
Originally posted by peterbf@Oct 31 2008, 16:11
Ok. Då är det uppklarat.
Hur itererar jag nu genom detta dokument för att hitta specifika element?
Jag är inte helt 100 på hur du menar men är jag fel ute får du formulera om frågan så jag kanske förstår bättre.

Du behöver inte spara ner informationen i en fil om du inte vill. Syntaxen för att plocka upp ett element påminner om xpath och kan se ut såhär:

HtmlNode content = doc.DocumentNode.SelectSingleNode("//div[@id='bodyContent']");

content kommer då att vara den div som har id bodyContent.

Jag testade en gång att plocka ut innehåll från engelska wikipedia, organisera den i en xml fil och därefter köra innehållet mot Google tanslate för att få ut texten på svenska. Slutresultatet blev väl sådär och det var inget jag använde men tekniken fungerade
Daniel.st är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-01, 16:15 #7
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
Okej. Väldigt givande svar.

I.o.m. att jag vill få ut den första informationen i varje artikel, exempelvis:
"Bob Marley föddes ...."

Denna kontenta ligger inom ett

-element. Så jag testade att hämta texten mellan de första

</p>-taggarna i dokumentet. Då får jag ut informationen jag vill, såtillvida att artikeln är utformad som så. Det jag vill få fram är att artiklarna är olika utformade. Om jag hämtar texten inom

-elementet i artikeln om Manchester United så får jag ut korrekt output, men om jag däremot hämtar ut texten från Bob Marley-artikeln får texten "Rastafari", då detta är den första

-taggen i den artikeln.

Jag har väldigt svårt att se hur jag ska lyckas med att få ut det jag vill i.o.m. att just den texten inte är omgiven av en unik id-nyckel i dess element.

Min nuvarande kod:

Kod:
        HtmlWeb document = new HtmlWeb();
        string url = string.Format("http://en.wikipedia.org/wiki/{0}", name);
        Uri uri = new Uri(url);

        HtmlDocument doc = document.Load(url);

        HtmlNode content = doc.DocumentNode.SelectSingleNode("//div[@id='bodyContent']");
     
        litFacts.Text = content.InnerText;
Några erfarenheter eller tips?
peterbf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-01, 16:48 #8
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
Fick inte redigera mitt sista inlägg. Skulle bara säga att jag kör givetvis denna XPath för att hämta första

-taggen:

("//p")
peterbf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-02, 21:12 #9
Daniel.sts avatar
Daniel.st Daniel.st är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2006
Inlägg: 762
Daniel.st Daniel.st är inte uppkopplad
Mycket flitig postare
Daniel.sts avatar
 
Reg.datum: Jul 2006
Inlägg: 762
Du kan ju även använda klassnamn eller andra attribut eller unika "egenskaper" för att identifiera ett element. //div[@id='a'] kan lika gärna vara //div[@class='b'].

Kan du inte hitta något alls som är unikt får du försöka hitta de närmaste överliggande elementet som har något unikt och sen försöka gräva dig nedåt genom att sätta upp lite olika regler i din kod.

Är sidorna uppbyggda på olika sätt blir det såklart lite lurigare. Då får du försöka hitta generella regler det går och hantera undantagen via någon annan kod när du hittar dem.
Daniel.st är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-04, 19:36 #10
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
peterbf peterbf är inte uppkopplad
Nykomling
 
Reg.datum: Sep 2008
Inlägg: 48
Tack för svaren.

Precis, Daniel.st, det blir för många generella regler att sätta upp. Har insett efter väldigt mycket jobb med detta att de flesta artiklar är helt olika utformade, att hämta ut HTML-koden som jag gjort är rätt bra, om det man vill ha ligger inom ett element med ett specifikt id eller klassnamn. Men det är mycket trixande, speciellt om man har ett system kopplat till att per automatik hämta artiklar och formattera dem on the fly.

Att hämta ut texten i MediaWiki-format är att rekommendera, om man har en parser, det finns inga ute i ASP.NET C# vad jag sett (hojta till om ni hittar nån), och i denna parser är det otroligt många regler och reguljära uttryck, ska man skriva detta själv ska du ha väldigt mycket tid och stora kunskaper om reguljära uttryck.

Men i.o.m. att de flesta artiklar som sagt är olika utformade kommer ni som jobbar med detta i framtiden få sätta upp regler för de undantag som finns, då måste ni även hitta alla undantag (artiklar är t.ex. olika om ni läser om en organisation, person, sjukdom m.fl.).

Det jag kommer göra är att försöka skapa en parser som formatterar MediaWikis format, det känns dessutom säkrare då det är detta formatet artiklarna är i redigerbart läge.

Som sagt, tack för svaren. Jag kommer uppdatera tråden om jag kommer på nåt nytt eller hittar en lösning tillslut.
peterbf är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:07.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017