按顺序获取html文档的链接

c# html html-agility-pack regex webbrowser-control

我想获得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

热门答案

您可以使用HTML DOM API遍历DOM树来获得正确的顺序。以下代码执行此操作。注意,我使用dynamic来访问DOM API。这是因为WebBrowserHtmlElement.FirstChild / HtmlElement.NextSibling不能用于此目的,因为它们为DOM文本节点返回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);
}

[更新]如果你真的需要获得<A>标签的HtmlElement对象列表,而不是dynamic本机元素,那么使用GetElementById仍可以使用一点技巧:

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因