我想获取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
答案 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