XPath从节点内的多个标签中检索值

时间:2017-03-21 18:52:33

标签: c# html xpath html-agility-pack

我目前正在创建一个抓取工具,而且我需要在一个集合中抽象数据,这样我就可以将它作为一行发送到数据库,很好又整洁。

这是我的程序的剪辑,它到目前为止正确地转到每个页面并检索正确的相应URL

int tempflag = 0;
//linkValueList is full of sub urls previously crawled in the program
foreach (string str in linkValueList)
{
    string tempURL = baseURL + str;
    HtmlWeb tempWeb = new HtmlWeb();
    HtmlDocument tempHtml = tempWeb.Load(tempURL);
    foreach (HtmlNode node in tempHtml.DocumentNode.SelectNodes("//article[@itemprop='product']"))
    {
        //get the category from the linkNameList
        string tempCategory = linkNameList.ElementAt(tempflag);
        //grab url
        string tempHref = node.GetAttributeValue("data-itemurl", string.Empty);
       //grab image url
       //grab brand
       //grab name
       //grab price
       //send to database via INSERT
    }
    tempflag++;
}

以下是我正在使用的网站代码,这是一个项目的示例,每个项目看起来类似

<article .... itemprop="product" data-itemurl="Item's url">
    <figure>
        <a ....>
            <img .... src="item's image source" ...>
        </a>
        <div ...>
            <a>....</a>
        </div>
    </figure>
    <div ...>
        <a ....>
                <div class="brand" itemprop="brand>Item's Brand</div>
            <div class="title" itemprop="name">Item's Name</div>
        </a>
        <div ....>
            <div class="msrp"></div>
            <div class="price" itemprop="price">$18.99 - $119.99</div>
            <span ...> ... </span>
        </div>
    </div>
</article>

正如您所看到的,我已经使用XPath让自己进入<article>标记,以使data-itemurl检索项目的网址。我现在的问题是我已经在<article>标签内了,现在有一种简单的方法来访问嵌套在里面的其他标签吗?

我需要获取图片网址的<img>标记,品牌<div itemprop="brand">,商品名称<div itemprop="name"><div itemprop="price">价格。

正如我之前提到的,我试图一次性获取所有这些信息,因此我可以在每个循环结束时将其作为单个insert语句查询到数据库。

2 个答案:

答案 0 :(得分:2)

当然,您可以使用另一个XPath在给定元素中进行查询。有一点需要注意,许多人一直困扰着,从来没有用/启动相对XPath,因为它会搜索整个文档,如果需要,可以从./开始,例如({{ 1}}假设总是在这里找到目标元素,否则你需要先检查结果是否不是SelectSingleNode()

null

答案 1 :(得分:0)

确定您可以使用node.Descendants("img")node.Descendants("div").Where(d => d.Attributes.Contains("itemprop") && d.Attributes["itemprop"].Value.Equals("price"))

希望它有所帮助。