FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Nykomling
|
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")); 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()); } } } 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? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
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 ![]() |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Nykomling
|
Ok. Då är det uppklarat.
Hur itererar jag nu genom detta dokument för att hitta specifika element? |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Flitig postare
|
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
|
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Medlem
|
icehole > Det är helt ok så länge man uppger källan..
|
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Mycket flitig postare
|
Citat:
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 ![]() |
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Nykomling
|
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; |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Nykomling
|
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") |
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Mycket flitig postare
|
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. |
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Nykomling
|
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. |
||
![]() |
![]() |
Svara |
|
|