私はHTML文書のすべてのリンクを取得したい。これは問題ではありませんが、明らかにすべてのリンクをアルファベット順に配列してから配列に格納します。私は元の順序(アルファベットではない)でリンクを持っていたい。
だから、最初に見つかったリンクを取得し、それを格納し、次に2番目のリンクを取得する可能性はありますか?私はすでに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ツリーを歩くことで、正しい順序を得ることができます 。次のコードはこれを行います。注、私はDOM APIにアクセスするためにdynamic
を使用します。これはWebBrowser
のHtmlElement.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);
}
[更新] dynamic
ネイティブ要素ではなく、 <A>
タグのHtmlElement
オブジェクトのリストを実際に取得する必要がある場合、これはGetElementById
を使用して少しトリックでも可能です。
private void btnGet_Click(object sender, EventArgs e)
{
// element.FirstChild / NextSibling don't work because they stop on DOM text nodes
var links = new List<HtmlElement>();
var document = this.webBrowser.Document;
dynamic domDocument = document.DomDocument;
Action<dynamic> walkTheDom = null;
walkTheDom = (domElement) =>
{
if (domElement.tagName == "A")
{
// get HtmlElement for the found <A> tag
string savedId = domElement.id;
string uniqueId = domDocument.uniqueID;
domElement.id = uniqueId;
links.Add(document.GetElementById(uniqueId));
if (savedId != null)
domElement.id = savedId;
else
domElement.removeAttribute("id");
}
for (var child = domElement.firstChild; child != null; child = child.nextSibling)
{
if (child.nodeType == 1) // is an Element node?
walkTheDom(child);
}
};
// walk the DOM for <A> tags
walkTheDom(domDocument.body);
// show the found tags
string combinedHtml = links.Aggregate(String.Empty, (html, element) => html + element.OuterHtml + Environment.NewLine);
MessageBox.Show(combinedHtml);
}