Det sker ret ofte at man har behov for at læse bestemte ting ud fra en hjemmeside, altså screenscraping, eller at parse egen HTML fx med henblik på at replace indhold med noget andet - regular expressions er langt fra altid et godt valg i forbindelse med denne type HTML-opgaver og andre muligheder som fx XPath eller LINQ to XML kræver, at HTML'en er valid og selvom det burde være en selvfølge er det ofte ikke tilfældet. Et rigtig godt alternativ til at screenscrape, parse HTML eller fixe fejl i HTML er Html Agility Pack (HAP), som kan downloades her; Html Agility Pack.
For at benytte HAP er alt du skal gøre at downloade løsningen fra hjemmesiden og tilføje en reference til HTMLAgilityPack.dll i dit projekt - og så er du klar til at manipulere med og hive information ud af en HTML-kilde. For at det hele kan give lidt mere mening vil jeg her komme med et par mindre eksempler;
Find billeder uden alt-attribut, indsæt den med default beskrivelse og gem som nyt dokument
HtmlDocument lHtmlDocument = new HtmlDocument();
lHtmlDocument.Load(@"C:\dokument.html");
var lNoAltAttributeNodes = lHtmlDocument.DocumentNode.SelectNodes("//img[not(@alt)]");
if (lNoAltAttributeNodes != null)
{
foreach (HtmlNode lHtmlNode in lNoAltAttributeNodes)
{
lHtmlNode.Attributes.Append("alt", "manglende alt...");
}
}
lHtmlDocument.Save(@"C:\opdateretdokument.html");
Find alle links og aflæs title-attributten
List<string> lTitles = new List<string>();
HtmlDocument lHtmlDocument = new HtmlDocument();
lHtmlDocument.Load(@"C:\dokument.html");
var lLinkNodes = lHtmlDocument.DocumentNode.SelectNodes("//a[@href]");
if (lLinkNodes != null)
{
foreach (HtmlNode lHtmlNode in lLinkNodes)
{
string lLinkTitle = lHtmlNode.GetAttributeValue("title", string.Empty);
if (!string.IsNullOrEmpty(lLinkTitle))
{
lTitles.Add(lLinkTitle);
}
}
}
Ovenstående er selvfølgelig relativt simple eksempler men de viser alligevel godt hvor lidt der faktisk skal til for at arbejde med HAP, det eneste der kan være lidt tricky i det - hvis man ikke har arbejdet med det før - er XPath-delen, og søger du lidt starthjælp til det kan det findes her; XPath hos w3schools. Det er ikke et krav at arbejde med XPath som ovenstående to eksempler benytter da man sagtens kan gennemløbe den parsede html med almindelige løkker, men det giver alligevel rigtig mening med XPath.
f4cc6bf3-6cee-4a08-bf38-00f1431f6af9|1|1.0
.NET, ASP.NET
.NET, screenscraping, C#, ASP.NET, HTML, XPath