Ich möchte aussagekräftigen Text aus einem HTML-Dokument extrahieren und ich habe html-agility-pack für dasselbe verwendet. Hier ist mein Code:
string convertedContent = HttpUtility.HtmlDecode(
ConvertHtml(HtmlAgilityPack.HtmlEntity.DeEntitize(htmlAsString))
);
KonvertierenHtml:
public string ConvertHtml(string html)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
StringWriter sw = new StringWriter();
ConvertTo(doc.DocumentNode, sw);
sw.Flush();
return sw.ToString();
}
Konvertieren zu:
public void ConvertTo(HtmlAgilityPack.HtmlNode node, TextWriter outText)
{
string html;
switch (node.NodeType)
{
case HtmlAgilityPack.HtmlNodeType.Comment:
// don't output comments
break;
case HtmlAgilityPack.HtmlNodeType.Document:
foreach (HtmlNode subnode in node.ChildNodes)
{
ConvertTo(subnode, outText);
}
break;
case HtmlAgilityPack.HtmlNodeType.Text:
// script and style must not be output
string parentName = node.ParentNode.Name;
if ((parentName == "script") || (parentName == "style"))
break;
// get text
html = ((HtmlTextNode)node).Text;
// is it in fact a special closing node output as text?
if (HtmlNode.IsOverlappedClosingElement(html))
break;
// check the text is meaningful and not a bunch of whitespaces
if (html.Trim().Length > 0)
{
outText.Write(HtmlEntity.DeEntitize(html) + " ");
}
break;
case HtmlAgilityPack.HtmlNodeType.Element:
switch (node.Name)
{
case "p":
// treat paragraphs as crlf
outText.Write("\r\n");
break;
}
if (node.HasChildNodes)
{
foreach (HtmlNode subnode in node.ChildNodes)
{
ConvertTo(subnode, outText);
}
}
break;
}
}
Jetzt in einigen Fällen, wenn die HTML-Seiten fehlerhaft sind (zum Beispiel die folgende Seite - http://rareseeds.com/cart/products/Purple_of_Romagna_Artichoke-646-72.html hat ein falsch formatiertes Meta-Tag wie <meta content="text/html; charset=uft-8" http-equiv="Content-Type">
) [Hinweis" uft "statt utf] mein Code kotzt zu dem Zeitpunkt, zu dem ich versuche, das HTML-Dokument zu laden.
Kann mir jemand vorschlagen, wie ich diese misslungenen HTML-Seiten überwinden und trotzdem relevanten Text aus einem HTML-Dokument extrahieren kann?
Danke, Kapil
Wie es in der HtmlAgilityPack-Projektseite heißt "Der Parser ist sehr tolerant gegenüber" realem "fehlerhaften HTML". Aber die Art von Fehler, die Sie beschreiben, ist zu gravierend, um vielleicht korrigiert zu werden. Sie können die Standardcodierung festlegen mit:
HtmlDocument doc = new HtmlDocument();
doc.OptionDefaultStreamEncoding = Encoding.UTF8;