3

我正在用 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 是我写的一个例子,实际的网站不是这样的。

4

4 回答 4

9

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

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

  }
于 2012-05-22T20:35:29.613 回答
2

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

如果 HTML 不是有效的 XML,我建议使用一些现有的 HTML 解析器——例如看这个——这对我们来说工作正常。

于 2012-05-22T20:18:05.783 回答
1

您还可以使用HtmlAgility

于 2012-05-22T20:24:01.370 回答
1

我认为这种情况很简单,可以使用正则表达式,例如<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
  }
}
于 2012-05-22T20:33:34.947 回答