如何使用 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,您可以执行以下操作:
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);
}
}
我正在尝试使用 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,您可以执行以下操作:
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);
}
}