浏览器给出的xPath是错误的,或者HTMLAgilityPack不能使用xPath



我正在尝试从谷歌翻译中获取所有语言。当我打开开发人员工具并在弹出所有语言时单击其中一种语言(单击箭头时),它为阿拉伯语提供了//*[@id=':7']/div/text(),但是当我尝试获取节点时,它返回 null:

 async Task AddLanguages()
    {
        try
        {
            // //*[@id=":6"]/div/text()
            HtmlDocument document = new HtmlDocument();
            document.LoadHtml(html);
            for (int i = 6; i <= 9; i++)
            {
                //*[@id=":6"]/div/text()            //*[@id=":6"]/div/div
                Debug.WriteLine(i);
                var element = document.DocumentNode.SelectSingleNode("//*[@id=':7']/div/text()");
                Trace.WriteLine(element == null, "Element is null");
            }
        }
        catch (Exception e)
        {
            this.ShowMessageAsync("Hata!", "Dilleri yüklerken hata ortaya çıktı.");
        }
    }

Element is null: True一直输出(我试图使用 for 循环来遍历语言,但它甚至不适用于单个语言!

我想你的 xpath 是错误的。您可以尝试如下操作:

        string Url = "https://translate.google.com/";
        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(Url);
        var arabic = doc.DocumentNode.Descendants("div").FirstOrDefault(_ => _.ChildNodes.Any(node => node.Name.Equals("#text") && node.InnerText.Equals("Arabic")));

由于我还不能发表评论...您是否尝试过在查找元素之前先单击dropdwon?点击//*[@id='gt-sl-gms'] 或它的内部div 将使元素可见。这应该有效..

无论如何,我无法$x在谷歌浏览器中为控制台工作。我目前收到未捕获的类型错误。不确定这是否与任何事情有关。

编辑:哦,等等,我想我知道你的问题。仔细检查元素后,似乎元素 (div) 在文本之前还有另一个div。所以试试/*[@id=':7']/div/text()[2]

最新更新