2

データをhtml入力タグに自動的に挿入するアプリケーションを作成していました。「/html/body/form/div/div[2]/div/div/input」のような特定のタグの xPath があり、HtmlAgilityPack の助けを借りて HtmlNode を取得できました

var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)webBrowser.Document.DomDocument;
StringReader sr = new StringReader(documentAsIHtmlDocument3.documentElement.outerHTML);
htmlDocument.Load(sr);
    if (htmlDocument.DocumentNode != null)
    {
        HtmlNode currentNode = htmlDocument.DocumentNode.SelectSingleNode(xPath);
    }

現在の HtmlNode に対応する Webbrowser.Document から HtmlElement を何らかの方法で選択する必要があります。誰かがそれを手伝ってくれますか?

ところで: 私はスパム ボットを作成していません。

皆さんこんにちは。再帰、多数の if ステートメント、および htmlagilitypack を使用しないソリューションを見つけましたが、残念ながら今は投稿できません。評判が足りないようです。

それでも、あまり手間がかからない場合は、htmlagilitypack を使用してこの問題を解決する方法を教えてください。私のコードは本当に厄介なようです。

4

2 に答える 2

1

みんなありがとう。ほぼ一日中考えてプログラミングした後、webbrowserのHtmlelementにテキストを入力したいので、htmlagilitypackHtmlNodeの代わりにネイティブhtmlElementを使用する必要があると判断しました。これが私が思いついたコードです。それでも誰かがhtmlagilitypackで解決策を示してくれたら幸いです。

    public HtmlElement selectHtmlNode(string xPath, HtmlElement htmlElement)
    {
        string currentNode;
        int indexOfElement;

        //get string representation of current Tag.
        if (xPath.Substring(1,xPath.Length-2).Contains('/'))
            currentNode = xPath.Substring(1, xPath.IndexOf('/', 1) - 1);
        else
            currentNode = xPath.Substring(1, xPath.Length-1);
        //gets the depth of current xPath
        int numOfOccurence = Regex.Matches(xPath, "/").Count;

        //gets the children's index
        int.TryParse(Regex.Match(currentNode, @"\d+").Value, out indexOfElement);

        //if i have to select nth-child ex: /tr[4]
        if (indexOfElement > 1)
        {
            currentNode = currentNode.Substring(0, xPath.IndexOf('[') - 1);
            //the tag that i want to get
            if (numOfOccurence == 1 || numOfOccurence == 0)
            {
                return htmlElement.Children[indexOfElement - 1];
            }
            //still has some children tags
            if (numOfOccurence > 1)
            {
                int i = 1;
                //select nth-child
                foreach (HtmlElement tempElement in htmlElement.Children)
                {
                    if (tempElement.TagName.ToLower() == currentNode && i == indexOfElement)
                    {
                        return selectHtmlNode(xPath.Substring(xPath.IndexOf('/', 1)), tempElement);
                    }
                    else if (tempElement.TagName.ToLower() == currentNode && i < indexOfElement)
                    {
                        i++;
                    }
                }
            }
        }
        else
        {
            if (numOfOccurence == 1 || numOfOccurence == 0)
            {
                return htmlElement.FirstChild;
            }
            if (numOfOccurence > 1)
            {
                foreach (HtmlElement tempElement in htmlElement.Children)
                {
                    if (tempElement.TagName.ToLower() == currentNode)
                    {
                        return selectHtmlNode(xPath.Substring(xPath.IndexOf('/', 1)), tempElement);
                    }
                }
            }
        }
        return null;
    }

関数はこのように呼び出されます。ここで、htmlControllerはあるクラスのインスタンスです。

HtmlElement currentElement = htmlController.selectHtmlNode("/body/form/div/div[2]/div/div/input", webBrowser.Document.GetElementsByTagName("html")[0]);
currentElement.SetAttribute("Value", "hello world");
于 2012-06-11T04:08:06.330 に答える
0

要素の特定の位置がわかっている場合は、要素を簡単に取得できます

HtmlNode mynode=htmlDocument.DocumentNode.SelectSingleNode("//div[@class='fooclass']");

または、HtmlNodeCollection の Select 関数を使用できます。

特定のノードを取得したら、必要に応じて mynode 変数の Attributes、InnerHtml、または InnerText プロパティを使用します。

例: ノードが画像 mynode.Attributes["src"].Valueを参照する場合、画像ソース URI が表示されます。

PS: htmlDocument は HtmlAgilityPack のクラスだと思います。

于 2012-06-10T14:55:02.143 に答える