【问题标题】:c# - reading HTML?c# - 阅读 HTML?
【发布时间】:2012-05-29 09:03:56
【问题描述】:

我正在用 C# 开发一个程序,我需要一些帮助。我正在尝试创建一个显示在某个网站上的数组或项目列表。我要做的是阅读锚文本,它是href。例如,这是 HTML:

<div class="menu-1">
    <div class="items">
        <div class="minor">
            <ul>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-1"
                    href="/?item=1">Item 1</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-2"
                    href="/?item=2">Item 2</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-3"
                    href="/?item=3">Item 3</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-4"
                    href="/?item=4">Item 4</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-5"
                    href="/?item=5">Item 5</a>
                </li>
            </ul>
        </div>
    </div>
</div>

所以我想从那个 HTML 中阅读:

string[,] array = {{"Item 1", "/?item=1"}, {"Item 2", "/?item=2"},
    {"Item 3", "/?item=3"}, {"Item 4", "/?item=4"}, {"Item 5", "/?item=5"}};

HTML 是我写的一个例子,实际的网站不是这样的。

【问题讨论】:

  • 您是否尝试查看 XmlTextReader 流?你会捕捉到所有的 a 并且 - 另外 - 即使是一个大的 XML 文件,它也很快。
  • 查看 HtmlAgilityPack

标签: c# html parsing


【解决方案1】:

如果 HTML 是有效的 XML,您可以使用 XmlDocument 类加载它,然后使用 XPaths 访问您想要的部分,或者您可以按照 Adriano 的建议使用 XmlReader(更多工作)。

如果 HTML 不是有效的 XML,我建议使用一些现有的 HTML 解析器 - 参见例如 this - 这对我们来说没问题。

【讨论】:

【解决方案2】:

您也可以使用HtmlAgility

【讨论】:

    【解决方案3】:

    我认为这种情况很简单,可以使用正则表达式,比如&lt;a.*title="([^"]*)".*href="([^"]*)"

    string strRegex = @"<a.*title=""([^""]*)"".*href=""([^""]*)""";
    RegexOptions myRegexOptions = RegexOptions.None;
    Regex myRegex = new Regex(strRegex, myRegexOptions);
    
    string strTargetString = ...;
    
    foreach (Match myMatch in myRegex.Matches(strTargetString))
    {
      if (myMatch.Success)
      {
        // Use the groups matched
      }
    }
    
    【解决方案4】:

    正如其他人所说,HtmlAgilityPack 是 html 解析的最佳选择,也请务必从 HtmlAgilityPack 站点下载 HAP Explorer,使用它来测试您的选择,无论如何,此 SelectNode 命令将获取所有具有 ID 的锚点,并且它以菜单项开头:

      HtmlDocument doc = new HtmlDocument();
      doc.Load(htmlFile);
      var myNodes = doc.DocumentNode.SelectNodes("//a[starts-with(@id,'menu-item-')]");
      foreach (HtmlNode node in myNodes)
      {
        Console.WriteLine(node.Id);
    
      }
    

    【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多