我正在抓取产品数据库,我能够获取所有HTML并检索大多数值,因为它们有一些独特的项目。但是我被困在一些有共同标签的区域。
示例:
<div class="label">Name:</div><div class="value">John</div>
<div class="label">Age:</div><div class="value">24</div>
关于如何获得这些标签和相关值的任何想法?
我正在使用HTMLAgilityPack,如果其中有什么可能有帮助的话。
答案 0 :(得分:3)
请使用xpath将div作为标签获取div,将类作为值
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(yourHtml);
Dictionary<string, string> dict = new Dictionary<string, string>();
//This will get all div's with class as label & class value in dictionary
int cnt = 1;
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='label']"))
{
var val = doc.DocumentNode.SelectSingleNode("//div[@class='value'][" + cnt + "]").InnerText;
if(!dict.ContainsKey(node.InnerText))//dictionary takes unique keys only
{
dict.Add(node.InnerText, val);
cnt++;
}
}
答案 1 :(得分:0)
你可以试试这个:
Int32 endingIndex;
var Name1 = GetTextBetween(yourHtml, "<div class=\"label\">", "</div><div class=\"value\">", out endingIndex);
var Value1 = GetTextBetween(yourHtml.SubString(endingIndex), "<div class=\"value\">", "</div>", out endingIndex);
var Name2 = GetTextBetween(yourHtml.SubString(endingIndex), "<div class=\"label\">", "</div><div class=\"value\">", out endingIndex);
var Value2 = GetTextBetween(yourHtml.SubString(endingIndex), "<div class=\"value\">", "</div>", out endingIndex);
public static String GetTextBetween(String allDataToParse, String startText, String endText, out Int32 indexOfEndText)
{
var indexOfStartText = allDataToParse.IndexOf(startText);
indexOfEndText = allDataToParse.IndexOf(endText);
return allDataToParse.Substring(indexOfStartText, indexOfEndText - indexOfStartText).Replace(startText, String.Empty) ;
}
答案 2 :(得分:0)
虽然XPath总是听起来像个好主意,但当你抓取数据时,你不能依赖HTML来形成良好的形式。许多网页会定期破坏HTML,以便更加努力。即使Mark的代码看起来很笨拙,但在某些情况下它实际上更强大。
听起来很可悲,当提供商在很长一段时间内证明可靠时,您只能依赖目标文档的一致性。理想情况下,我会使用正则表达式来搜索我想要的标签。这是一个很好的起点:
Regular expression for extracting tag attributes
不幸的是,只有你知道你正在处理的文件的确切怪癖。如果您正在查看的页面可靠,那么像Mark建议的那样简单的解决方案可能会有效。坦率地说,它不太可能脆弱而且意外崩溃。
如果您使用HatSoft建议的HTML文档解析代码,您的程序可能在大多数文档上都能正常运行,但根据我的经验,网站会随机抛出错误,意外更改布局,或者有时您的网络代码只会收到部分字符串。也许这没关系,但我建议你尝试两种方法,看看哪种方法更可靠。