在 html 标记 Xpath 和 HtmlAgility 之间获取值

本文关键字:之间 获取 HtmlAgility html 标记 Xpath | 更新日期: 2023-09-27 18:34:12

到目前为止,我正在尝试检索某个网站的HTML标签之间的文本......

例如,假设我需要提取这些 span 标签之间的文本,我将如何处理,我收到一个错误,指出"对象引用未设置为对象的实例"这里是 HTML

在此部分之前还有HTML代码;我不知道这是否应该有所作为。

<div class="thumbnail-details">
<ul>
    <li> … </li>
    <li class="product-title">
        <span class="thumbnail-details-grey">The Blaster Portable Wireless Speaker in Black</span>
    </li>
    <li> … </li>
</ul>
</div>

到目前为止,我的 C# 代码是

    HtmlWeb hw = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse.htm#Pgroup=1");
        if (htmlDoc.DocumentNode != null)
        {
            foreach (HtmlNode text in htmlDoc.DocumentNode.SelectNodes("//span[@class='thumbnail-details-grey']/text()"))
            {
                Console.WriteLine(text.InnerText);
            }

我可以在这里得到一些帮助吗,我想提取"黑色的冲击波便携式无线扬声器"。

在 html 标记 Xpath 和 HtmlAgility 之间获取值

我建议使用CsQuery(https://www.nuget.org/packages/CsQuery/1.3.4),然后它就像

var doc = CQ.CreateFromUrl(@"http://www.karmaloop.com/Browse.htm");
var nodes = doc.Find("span.thumbnail-details-grey");
foreach(var node in nodes)
    Console.WriteLine(node.InnerText);

您的代码运行良好,但您必须加载正确的页面才能使其正常工作。您正在加载的页面使用 ajax 请求来加载您在浏览器中看到的结果。

因此,您必须使用以下方法,而不是您当前使用的URL:

HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse?Pgroup=1&ajax=true&version=2");

然后你的代码就可以工作了。我仍在寻找这个请求被放在一起的地方......

但是查询看起来很容易猜到。例如,页面http://www.karmaloop.com/Browse.htm#Pdept=11&PageSize=30&Pgroup=1请求 url http://www.karmaloop.com/Browse?Pdept=11&PageSize=30&Pgroup=1&ajax=true&version=2 。因此,您所要做的就是使用您的网址并在#之后开始构建一个新网址。