按顺序获取html文档的链接

时间:2013-12-01 00:18:56

标签: c# html regex webbrowser-control html-agility-pack

我想获取HTML文档的所有链接。这不是问题,但显然它将所有链接按字母顺序排列,然后逐个将它们存储在一个数组中。我希望链接按原始顺序排列(不是按字母顺序排列)。

那么有没有可能获得第一个找到的链接,存储它,然后第二个,...?我已经尝试过使用HtmlAgilityPack和Webbrowser-Control方法,但都按字母顺序排序。原始订单对于以后的目的很重要。

我听说Regex可能有可能,但我找到了足够多的答案,他们说你不应该用它来进行HTML解析。那我怎么能这样做呢?

这是Webbrowser-Control代码,我试图用来获取链接并将它们存储到一个数组中:

    private void btnGet_Click(object sender, EventArgs e)
    {
        HtmlWindow mainFrame = webFl.Document.Window.Frames["mainFrame"];
        HtmlElementCollection links = mainFrame.Document.Links;

        foreach (HtmlElement link in links)
        {
            string linkText = link.OuterHtml;
            if (linkText.Contains("puzzle"))
            {
                arr[i] = linkText;
                i++;
            }
        }
    }

提前谢谢你, OPAK

1 个答案:

答案 0 :(得分:1)

您可以使用HTML DOM API遍历DOM树来获取正确的顺序。以下代码执行此操作。注意,我使用dynamic来访问DOM API。这是因为WebBrowser的{​​{1}} / HtmlElement.FirstChild不能用于此目的,因为它们会为DOM文本节点返回HtmlElement.NextSibling

null

[更新] 如果您确实需要获取private void btnGet_Click(object sender, EventArgs e) { Action<object> walkTheDom = null; var links = new List<object>(); // element.FirstChild / NextSibling don't work as they stop at DOM text nodes walkTheDom = (element) => { dynamic domElement = element; if (domElement.tagName == "A") links.Add(domElement); for (dynamic child = domElement.firstChild; child != null; child = child.nextSibling) { if (child.nodeType == 1) // Element node? walkTheDom(child); } }; walkTheDom(this.webBrowser.Document.Body.DomElement); string html = links.Aggregate(String.Empty, (a, b) => a + ((dynamic)b).outerHtml + Environment.NewLine); MessageBox.Show(html); } 代码的HtmlElement个对象列表,而不是<A>本机元素,那么仍然可以使用使用dynamic的一个小技巧:

GetElementById