Comment puis-je supprimer uniquement la balise d’un site Web?

Je travaille sur un webcrawler. Au moment où je gratte le contenu entier, puis en utilisant une expression régulière, je supprime les balises , , et autres, et récupère le contenu du corps.

Cependant, j’essaie d’optimiser les performances et je me demandais s’il était possible de ne gratter que le de la page?

 namespace WebScrapper { public static class KrioScraper { public static ssortingng scrapeIt(ssortingng siteToScrape) { ssortingng HTML = getHTML(siteToScrape); ssortingng text = ssortingpCode(HTML); return text; } public static ssortingng getHTML(ssortingng siteToScrape) { ssortingng response = ""; HttpWebResponse objResponse; HttpWebRequest objRequest = (HttpWebRequest) WebRequest.Create(siteToScrape); objRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; " + "Windows NT 5.1; .NET CLR 1.0.3705)"; objResponse = (HttpWebResponse) objRequest.GetResponse(); using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { response = sr.ReadToEnd(); sr.Close(); } return response; } public static ssortingng ssortingpCode(ssortingng the_html) { // Remove google analytics code and other JS the_html = Regex.Replace(the_html, "<script.*?", "", RegexOptions.Singleline | RegexOptions.IgnoreCase); // Remove inline stylesheets the_html = Regex.Replace(the_html, "<style.*?", "", RegexOptions.Singleline | RegexOptions.IgnoreCase); // Remove HTML tags the_html = Regex.Replace(the_html, "</?[az][a-z0-9]*[^]*>", ""); // Remove HTML comments the_html = Regex.Replace(the_html, "", ""); // Remove Doctype the_html = Regex.Replace(the_html, "", ""); // Remove excessive whitespace the_html = Regex.Replace(the_html, "[\t\r\n]", " "); return the_html; } } } 

De Page_Load j’appelle la méthode scrapeIt() transmettant la chaîne que je récupère dans une zone de texte de la page.

Je pense que votre meilleure option consiste à utiliser un parsingur HTML léger ( quelque chose comme Majestic 12 , basé sur mes tests, il est environ 50 à 100% plus rapide que HTML Agility Pack) et à ne traiter que les nœuds qui vous intéressent ( et ). Majestic 12 est un peu plus difficile à utiliser que HTML Agility Pack, mais si vous recherchez des performances, il vous aidera certainement!

Cela vous mènera à la fin de ce que vous demandez, mais vous devrez quand même télécharger la page entière. Je ne pense pas qu’il y ait un moyen de contourner cela. Ce que vous allez économiser, c’est générer les nœuds DOM pour tous les autres contenus (en dehors du corps). Vous devrez les parsingr, mais vous pouvez ignorer tout le contenu d’un nœud que vous ne souhaitez pas traiter.

Voici un bon exemple d’utilisation de l’parsingur M12.

Je n’ai pas d’exemple concret sur la manière de saisir le corps, mais j’en ai un qui consiste à saisir uniquement les liens et avec peu de modifications, il y parviendra. Voici la version brute:

 GrabBody(ParserTools.OpenM12Parser(_response.BodyBytes)); 

Vous devez ouvrir l’parsingur M12 (l’exemple de projet fourni avec M12 contient des commentaires qui détaillent exactement la manière dont toutes ces options affectent les performances, ET ILS LE FONT !!!):

 public static HTMLparser OpenM12Parser(byte[] buffer) { HTMLparser parser = new HTMLparser(); parser.SetChunkHashMode(false); parser.bKeepRawHTML = false; parser.bDecodeEntities = true; parser.bDecodeMiniEntities = true; if (!parser.bDecodeEntities && parser.bDecodeMiniEntities) parser.InitMiniEntities(); parser.bAutoExtractBetweenTagsOnly = true; parser.bAutoKeepScripts = true; parser.bAutoMarkClosedTagsWithParamsAsOpen = true; parser.CleanUp(); parser.Init(buffer); return parser; } 

Analyser le corps:

 public void GrabBody(HTMLparser parser) { // parser will return us tokens called HTMLchunk -- warning DO NOT destroy it until end of parsing // because HTMLparser re-uses this object HTMLchunk chunk = null; // we parse until returned oChunk is null indicating we reached end of parsing while ((chunk = parser.ParseNext()) != null) { switch (chunk.oType) { // matched open tag, ie  case HTMLchunkType.OpenTag: if (chunk.sTag == "body") { // Start generating the DOM node (as shown in the previous example link) } break; // matched close tag, ie  case HTMLchunkType.CloseTag: break; // matched normal text case HTMLchunkType.Text: break; // matched HTML comment, that's stuff between  case HTMLchunkType.Comment: break; }; } } 

La génération des nœuds DOM est délicate, mais la classe Majestic12ToXml vous aidera à le faire. Comme je l’ai dit, ce n’est pas du tout l’équivalent du 3-liner que vous avez vu avec le pack d’agilité HTML, mais une fois que vous aurez acquis les outils, vous pourrez obtenir exactement ce dont vous avez besoin pour une fraction du coût en performances et probablement aussi. beaucoup de lignes de code.

Je suggérerais de tirer parti du Pack d’agilité HTML pour effectuer l’parsing / la manipulation HTML.

Vous pouvez facilement sélectionner le corps comme ceci:

 var webGet = new HtmlWeb(); var document = webGet.Load(url); document.DocumentNode.SelectSingleNode("//body") 

Toujours la méthode la plus simple / la plus rapide (la moins précise).

 int start = response.IndexOf(" 

Évidemment, s’il y a du javascript dans la balise HEAD comme …

 document.write(""); 

Ensuite, vous vous retrouverez avec un peu plus que ce que vous vouliez.