如何使用 html-agility-pack 处理 xpath

how to handle xpath with html-agility-pack

我正在尝试使用 c# 和 html-agility-pack 从 aliexpress 中抓取 一些数据。

通常,某些元素的 xpath 如下所示:

/html/body/div[7]/div[2]/div[4]/div/div/div[2]/div[1]/div[2]/div/div[1]/a

但是当我尝试在 aliexpress 中复制一个元素的 xpath 时,它看起来像这样:

//*[@id="node-gallery"]/div[4]/div/div/ul/li[1]/div[1]/div[1]/a

然后节点列表return为null,程序无法进行任何处理。

         var html = @"https://best.aliexpress.com/?lan=en";
        HtmlWeb web = new HtmlWeb();

        var htmlDoc = web.Load(html);

        var nodes = htmlDoc.DocumentNode.SelectNodes("//*[@id]/div/div[2]/div/div[2]/dl//dd/div/div[2]/ul/li//a");
        if (nodes.Count <= 0)
        {
            Console.WriteLine("nothing found");

        }
        else
        {
            foreach (HtmlNode n in nodes)
            {
                Console.WriteLine(n.Attributes);
            }
        }
        Console.ReadKey();

确实,当您将鼠标悬停在这些项目上时,会发出 API 请求。您可能可以在其中一个源文件中找到详细信息,但是查看网络选项卡中的前 2 个它们具有以下模式(url 已解码):

https://best.aliexpress.com/api/load_ams_path.do?path=aliexpress.com/common/@langField/ru/c-women-content.htm https://best.aliexpress.com/api/load_ams_path.do?path=aliexpress.com/common/@langField/ru/c-men-content.htm

我怀疑其他人也在效仿。

您可以向这些端点发出请求以获取 html 然后您可以从中检索所需的内容。要通过您的 xpath 获取在浏览器中匹配的 xpath 元素的 href,您可以执行以下操作:

fiddle

using System;
using HtmlAgilityPack;

public class Program
{

public static void Main()
    {
        string url = "https://best.aliexpress.com/api/load_ams_path.do?path=aliexpress.com/common/@langField/ru/c-women-content.htm";
        HtmlWeb web = new HtmlWeb();
        var htmlDoc = web.Load(url);
        var nodetest1 = htmlDoc.DocumentNode.SelectSingleNode("*//li[@class='sup-brand-item'][1]/a");  
        Console.WriteLine(nodetest1.Attributes["href"].Value); 
    }
}