HTML 敏捷包选择节点

Posted

技术标签:

【中文标题】HTML 敏捷包选择节点【英文标题】:HTML Agility Pack Select Nodes 【发布时间】:2011-12-28 03:59:02 【问题描述】:

我正在尝试使用 html Agility 包从站点中抓取一些数据。我真的很难弄清楚如何在 foreach 中使用 selectnodes,然后将数据导出到列表或数组中。

这是我目前正在使用的代码。

       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.

        

我在上面的代码中有 cmets,显示了哪些有效,哪些无效,以及我想要完成的任务。

如果有人有任何建议或阅读,那就太好了!我一直在搜索论坛和示例,但没有找到任何我可以使用的东西。

【问题讨论】:

【参考方案1】:

注释掉的SelectNodes 的第一个问题不起作用,因为“id”不是元素名称,而是属性名称。您在其他表达式中使用了正确的语法来选择属性和比较值。例如,//ElementName[@attributeName='value']。我认为即使[attributeName='value'] 也应该可以,但我还没有测试过。

SelectNodes 函数内的语法称为“XPath”。 This link 可能会帮到你。

您选择的seller 节点是node 的兄弟节点,当前迭代是具有alt 属性的img。但是我认为您想要的正确语法只是img[@alt]

你说它不会编译的下一个问题,检查错误消息,它可能会抱怨参数类型。 sellers.Add 我认为正在寻找另一个 HtmlNode 的名称,而不是 add 中的表达式返回的属性。

另外,请查看 Html Agility pack 文档和其他有关语法的问题。

【讨论】:

以上是关于HTML 敏捷包选择节点的主要内容,如果未能解决你的问题,请参考以下文章

Html 敏捷包 - 新的 HtmlAttribute

Xpath 使用 html 敏捷包返回 null

华为云计算之物理节点CNA安装教程

HTML 敏捷包

知识刷屏:Mendix敏捷开发零基础学习《二》

HTML 敏捷包 - 解析表