Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从HTML中提取标签,然后在单独的DIV标记中提取值_C#_Html_Html Parsing - Fatal编程技术网

C# 从HTML中提取标签,然后在单独的DIV标记中提取值

C# 从HTML中提取标签,然后在单独的DIV标记中提取值,c#,html,html-parsing,C#,Html,Html Parsing,我正在抓取一个产品数据库,我能够获取所有HTML并检索大多数值,因为它们有一些独特的项。然而,我被困在一些地区,有共同的标签 例如: <div class="label">Name:</div><div class="value">John</div> <div class="label">Age:</div><div class="value">24</div> 姓名:约翰 年龄:24 关于如何

我正在抓取一个产品数据库,我能够获取所有HTML并检索大多数值,因为它们有一些独特的项。然而,我被困在一些地区,有共同的标签

例如:

<div class="label">Name:</div><div class="value">John</div>
<div class="label">Age:</div><div class="value">24</div>
姓名:约翰
年龄:24
关于如何获得这些标签和相关值,有什么想法吗


如果其中有什么可以帮助的话,我将使用HTMLAgilityPack作为其余部分。

请使用xpath获取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++;
    }
} 
HtmlDocument doc=新的HtmlDocument();
doc.LoadHtml(yourHtml);
Dictionary dict=新字典();
//这将在字典中获得所有以class作为标签和class值的div
int-cnt=1;
foreach(doc.DocumentNode.SelectNodes(“//div[@class='label']”)中的HtmlNode节点)
{
var val=doc.DocumentNode.SelectSingleNode(//div[@class='value'][“+cnt+”])。InnerText;
如果(!dict.ContainsKey(node.InnerText))//字典只接受唯一键
{
dict.Add(node.InnerText,val);
cnt++;
}
} 
您可以尝试以下方法:

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) ;
}
Int32-endingIndex;
var Name1=GetTextBetween(yourHtml,“,”,out-endingIndex);
var Value1=GetTextBetween(您的html.SubString(endingIndex),“”,“”,out endingIndex);
var Name2=GetTextBetween(您的html.SubString(endingIndex),“”,“”,out endingIndex);
var Value2=GetTextBetween(您的html.SubString(endingIndex),“”,“”,out endingIndex);
公共静态字符串GetTextBetween(字符串allDataToParse、字符串startText、字符串endText、out Int32 indexOfEndText)
{
var indexOfStartText=allDataToParse.IndexOf(startText);
indexOfEndText=allDataToParse.IndexOf(endText);
返回allDataToParse.Substring(indexOfStartText,indexOfEndText-indexOfStartText).Replace(startText,String.Empty);
}

尽管XPath听起来总是一个不错的主意,但当您在抓取数据时,您不能依赖HTML格式良好。许多网页经常破坏它们的HTML,以使抓取更困难。尽管Mark的代码看起来很笨拙,但在某些情况下它实际上更健壮

尽管听起来很悲哀,但只有当提供者在很长一段时间内被证明是可靠的时,您才能依赖目标文档中的一致性。理想情况下,我会使用正则表达式来搜索我特别想要的标记。这里有一个很好的起点:

不幸的是,只有您知道您正在处理的文档的确切怪癖。一个简单的解决方案,就像马克建议的那样,如果你正在查看的页面是可靠的,它可能会起作用。坦率地说,它不太可能是脆弱的和意外崩溃


如果您使用HatSoft建议的HTML文档解析代码,您的程序可能在大多数文档上运行良好,但根据我的经验,网站会随机抛出错误,意外更改布局,或者有时您的网络代码只接收部分字符串。也许这没关系,但我建议您尝试这两种方法,看看哪些方法对您更可靠。

您到底遇到了什么问题?您在识别标签和值时有困难吗?或者您在将特定值与特定标签进行匹配时遇到问题?确切地说,我需要匹配它们。这是可行的,但是如何才能将它们配对?那么那个label1=value1?@JDRoberson给我15分钟,我把它写下来you@JDRoberson请向我显示代码和完整的错误消息error 1'HtmlAgilityPack.HtmlNodeCollection'不包含'InnerText'的定义,并且不能使用接受类型为'HtmlAgilityPack.HtmlNodeCollection'的第一个参数的扩展方法'InnerText'找到(您是否缺少using指令或程序集引用?)c:\users\robejoha02\documents\visual studio 11\Projects\CardDB\CardDB\Form1.cs 42 63 CardDB代码的第12行。@JDRoberson我很抱歉,他们的错误是我的代码中的错误我已更正,请接受更新的答案