HTML parsing og Screenscraping med Html Agility Pack (HAP)

12. maj 2010

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.

.NET, ASP.NET , , , , ,

Kommentarer

27-02-2011 11:57:19 #
Jeg har brugt den et par gange, men jeg bryder mig ikke så meget om xpath selectoren, men jeg kan ikke få fizzler udvidelsen til at virke :-/ Ellers er det et genialt stykke værktøj.

Tilføj kommentar


(Viser dit Gravatar icon)

  Country flag

biuquote
  • Kommentar
  • Eksempel
Loading