我目前正在创建一个抓取工具,而且我需要在一个集合中抽象数据,这样我就可以将它作为一行发送到数据库,很好又整洁。
这是我的程序的剪辑,它到目前为止正确地转到每个页面并检索正确的相应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语句查询到数据库。
答案 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"))
希望它有所帮助。