【问题标题】:Scrape HTML for label then value in separate DIV tags为标签刮取 HTML,然后在单独的 DIV 标记中取值
【发布时间】:2012-07-17 22:47:26
【问题描述】:

我正在抓取产品数据库,并且能够获取所有 HTML 并检索大多数值,因为它们具有一些独特的项目。但是我被困在一些有共同标签的领域。

例子:

<div class="label">Name:</div><div class="value">John</div>
<div class="label">Age:</div><div class="value">24</div>

关于如何获得这些标签和相关值的任何想法?

如果其中有一些可能有帮助的东西,我将使用 HTMLAgilityPack。

【问题讨论】:

  • 您遇到的具体问题是什么?您在识别标签和值时遇到问题吗?或者您在将特定值与特定标签匹配时遇到问题?
  • 没错,我需要匹配它们。

标签: c# html html-parsing


【解决方案1】:

请使用xpath获取以class为标签、以class为值的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++;
    }
} 

【讨论】:

  • 这行得通,但是我该如何配对呢?这样 label1=value1?
  • @JDRoberson 给我 15 分钟我给你写下来
  • @JDRoberson 请给我看代码和完整的错误信息
  • 错误 1 ​​'HtmlAgilityPack.HtmlNodeCollection' 不包含 'InnerText' 的定义并且没有扩展方法 'InnerText' 接受类型为 'HtmlAgilityPack.HtmlNodeCollection' 的第一个参数(您是否缺少使用指令或程序集引用?) c:\users\robejoha02\documents\visual studio 11\Projects\CardDB\CardDB\Form1.cs 42 63 CardDB 第 12 行代码。
  • @JDRoberson 我很抱歉他们是我的代码中的一个错误我已更正它请更新答案
【解决方案2】:

你可以试试这个:

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) ;
}

【讨论】:

    【解决方案3】:

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

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

    Regular expression for extracting tag attributes

    不幸的是,只有您知道您正在处理的文档的确切怪癖。如果您正在查看的页面是可靠的,那么一个简单的解决方案(如 Mark 提出的解决方案)可能会奏效。坦率地说,它不太可能变得脆弱和意外崩溃。

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

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多