2017-03-21 67 views
1

我目前正在创建一个爬虫,并且我需要在一个集合中抽象数据,所以我可以将它作为一行发送到数据库,整齐。XPath从一个节点内的多个标签检索值

这里是剪断,它在我的计划中,它正确地去每个页面到目前为止并检索正确的对应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检索项目的URL。我的问题是现在我已经在<article>标签内,是否有一种简单的方法可以访问嵌入其中的其他标签?

我需要登录该图片的url的<img>标记,品牌的<div itemprop="brand">,项目名称的<div itemprop="name">以及价格的<div itemprop="price">

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

回答

2

确定您可以使用另一个XPath在给定元素内进行查询。有一件事要注意,很多人一直在困扰着,从来没有启动一个与/相关的XPath,因为它会搜索整个文档,如果需要的话可以从./开始,例如(SelectSingleNode()假定总是在这里找到目标元素,否则,你需要检查结果是否不null在前):

foreach (HtmlNode node in tempHtml.DocumentNode.SelectNodes("//article[@itemprop='product']")) 
{ 
    img = node.SelectSingleNode(".//img").GetAttributeValue("src",""); 
    brand = node.SelectSingleNode(".//div[@itemprop='brand']").InnerText.Trim(); 
    ..... 
} 
+0

完美,我想进入我的那些天,我很接近,但没有正确的XPath语法。谢谢一堆! –

0

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

希望它能帮助。