Gratter une page Web avec C # et HTMLAgility

J’ai lu que HTMLAgility 1.4 est une excellente solution pour gratter une page Web. En tant que nouveau programmeur, j’espère pouvoir obtenir quelques informations sur ce projet. Je le fais comme un formulaire de demande. La page sur laquelle je travaille est assez simple. Les informations dont j’ai besoin sont bloquées entre 2 balises et. Mon objective est d’extraire les données pour Part-Num, Manu-Number, Description, Manu-Country, Dernière modification, Dernière modification par de la page et d’envoyer les données à une table SQL. Une particularité est qu’il existe également une petite image png qui doit également être saisie à partir de src = “/ code pièce / numéro.

Je n’ai pas de code complet qui woks. Je pensais que ce bout de code me dirait si je vais dans la bonne direction. Même en entrant dans le débogage, je ne peux pas voir que cela fait quelque chose. Quelqu’un pourrait-il me diriger dans la bonne direction à ce sujet? Le plus détaillé le mieux, car il est évident que j’ai beaucoup à apprendre. Merci je l’apprécierais vraiment.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using HtmlAgilityPack; using System.Xml; namespace Stats { class PartParser { static void Main(ssortingng[] args) { HtmlDocument doc = new HtmlDocument(); doc.LoadHtml("http://localhost");//my understanding this reads the entire page in? var tables = doc.DocumentNode.SelectNodes("//table");// I assume that this sets up the search for words containing table } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); Console.ReadKey(); } } } } 

Le code web est:

     Part Number Database: Item Record 
Part-Num072140
Manu-Number00721408
DescriptionWidget 3.5
Manu-CountryUnited States
Last Modified26 Jan 2009, 8:08 PM
Last Modified ByManu

Consultez cet article sur 4GuysFromRolla

http://www.4guysfromrolla.com/articles/011211-1.aspx

C’est l’article que j’ai utilisé comme sharepoint départ pour HTML Agility Pack et qui a très bien fonctionné. Je suis convaincu que vous obtiendrez toutes les informations dont vous avez besoin dans cet article pour effectuer les tâches que vous essayez d’accomplir.

La première partie est éteinte:

 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml("http://localhost"); 

LoadHtml(html) charge une chaîne html dans le document, je pense que vous voulez quelque chose comme ceci à la place:

 HtmlWeb htmlWeb = new HtmlWeb(); HtmlDocument doc = htmlWeb.Load("http://stackoverflow.com"); 

Un code de travail, selon la source HTML que vous avez fournie. Cela peut être factorisé, et je ne vérifie pas les valeurs NULL (en rows , cells et chaque valeur à l’intérieur du case ). Si vous avez la page 127.0.0.1 , cela fonctionnera. Collez-le simplement dans la méthode Main d’une application console et essayez de le comprendre.

 HtmlDocument doc = new HtmlWeb().Load("http://127.0.0.1"); var rows = doc.DocumentNode.SelectNodes("//table[@class='data']/tr"); foreach (var row in rows) { var cells = row.SelectNodes("./td"); ssortingng title = cells[0].InnerText; var valueRow = cells[2]; switch (title) { case "Part-Num": ssortingng partNum = valueRow.SelectSingleNode("./img[@alt]").Atsortingbutes["alt"].Value; Console.WriteLine("Part-Num:\t" + partNum); break; case "Manu-Number": ssortingng manuNumber = valueRow.SelectSingleNode("./img[@alt]").Atsortingbutes["alt"].Value; Console.WriteLine("Manu-Num:\t" + manuNumber); break; case "Description": ssortingng description = valueRow.InnerText; Console.WriteLine("Description:\t" + description); break; case "Manu-Country": ssortingng manuCountry = valueRow.InnerText; Console.WriteLine("Manu-Country:\t" + manuCountry); break; case "Last Modified": ssortingng lastModified = valueRow.InnerText; Console.WriteLine("Last Modified:\t" + lastModified); break; case "Last Modified By": ssortingng lastModifiedBy = valueRow.InnerText; Console.WriteLine("Last Modified By:\t" + lastModifiedBy); break; } }