HTML Agility Pack de Sélectionner des Noeuds
Je suis en train d'utiliser le HTML Agility pack pour gratter des données à partir d'un site. Je suis vraiment du mal à trouver comment utiliser selectnodes à l'intérieur d'un foreach et d'exporter les données d'une liste ou d'une matrice.
Voici le code, je travaille jusqu'à présent.
string result = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://www.amazon.com/gp/offer-listing/B002UYSHMM/);
request.Method = "GET";
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(new StringReader(result));
HtmlNode root = doc.DocumentNode;
string itemdesc = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText; //this works perfectly to get the title of the item
//HtmlNodeCollection sellers = doc.DocumentNode.SelectNodes("//id['bucketnew']/div/table/tbody/tr/td/ul/a/img/@alt");//this does not work at all in getting the alt attribute from the seller images
HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//span[@class='price']"); //this works fine getting the prices
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='resultsset']/table/tbody[@class='result']/tr"); //this is the code I am working on to try to collect each tr in the result. I then want to eather add each span.price to a list from this and also add each alt attribute from the seller image to a list. Once I get this working I will want to use an if statement in the case that there is text for the seller name instead of an image.
List<string> sellers = new List<string>();
List<string> prices = new List<string>();
foreach (HtmlNode node in nodes)
{
HtmlNode seller = node.SelectSingleNode(".//img/@alt"); //I am not sure if this works
sellers.Add(seller.SelectSingleNode("img").Attributes["alt"]); //this definitly does not work and will not compile.
}
J'ai des commentaires dans le code ci-dessus montrant ce qui fonctionne et ce qui ne fonctionne pas et le tri de ce que je veux accomplir.
Si quelqu'un a des sugguestions ou de la lecture, ce serait super! J'ai été la recherche de forums et d'exemples et n'ont pas trouvé tout ce que je peux utiliser.
Vous devez vous connecter pour publier un commentaire.
Votre premier problème avec le commentaire sur
SelectNodes
ne fonctionne pas parce que 'id' n'est pas un nom d'élément, c'est un nom d'attribut. Vous avez utilisé la bonne syntaxe dans vos autres expressions de sélection d'un attribut et une comparaison de la valeur. Par exemple,//ElementName[@attributeName='value']
. Je pense que même[attributeName='value']
devrait fonctionner, mais je n'ai pas testé.La syntaxe à l'intérieur de la
SelectNodes
fonction est appelée "XPath". Ce lien peut vous aider.La
seller
nœud que vous choisissez est un frère ou une sœur denode
pour l'itération en cours qui est une img avec un attribut alt. Cependant, je pense que la syntaxe correcte vous voulez, c'est justeimg[@alt]
.Le problème suivant où vous dites qu'il ne compile pas, vérifiez le message d'erreur, il sera probablement de se plaindre du dos types d'argument.
sellers.Add
, Je pense, est à la recherche d'un autre nom HtmlNode, pas un attribut qui est ce que l'expression à l'intérieur de la ajouter est de retour.Aussi, découvrez le Html Agility pack documentation et les autres questions concernant la syntaxe.