【问题标题】:HtmlAgilityPack getting all value inside a <div>HtmlAgilityPack 在 <div> 中获取所有值
【发布时间】:2017-04-18 12:57:15
【问题描述】:

我正在尝试从网站获取值。这些值在一个 div 内,在那个“主 div”下还有更多的 div(如果我可以这样称呼它)。 我想要的是获取“主 div”内的那些 div 值。 我试过这段代码:

 string url = "www.examplesite.com";

    HtmlWeb web = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = web.Load(url);
    HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//div[@id='plex_container']");
    foreach (HtmlNode node in collection)
    {
        string cptitle = node.SelectSingleNode(".//div[@id='pltexts']").InnerText;
        listBox1.Items.Add(cptitle);
    }

网站的结构(在 F12 运行时)如下所示:

    <body onload="initialize()" id="dashboard">
<div id="header">...</div>
     <div id="dashboard_container">
         <div id="comm" class="comm_expanded">
            <div id="pl_header_tab">...</div>
            <div id="pltext_tab">...</div>
            <div id="plex_container">
                <div id="pl_status"></div>
                <div id="pltexts">
                   <div class="plext">...</div> // <-- Im trying to get these values
                   <div class="plext">...</div> // <-- 
                   <div class="plext">...</div> // <-- 
                   <div class="plext">...</div> // <--
                   <div class="plext">...</div> // <--

我收到 foreach 的“对象引用未设置为对象的实例”错误...

【问题讨论】:

  • 您的 html 不包含 id=plext_container 的 div,它也是 pltexts 而不是 plexts
  • 对不起,我拼错了。我编辑了帖子。

标签: c# html xpath html-agility-pack


【解决方案1】:

使用提供的 HTML sn-p,您可以使用 XPath 选择器直接获取文本节点:

var html =
@"
<body onload='initialize()' id='dashboard'>
<div id='header'>...</div>
<div id='dashboard_container'>
<div id='comm' class='comm_expanded'>
<div id='pl_header_tab'>...</div>
<div id='pltext_tab'>...</div>
<div id='plex_container'>
<div id='pl_status'></div>
<div id='pltexts'>
<div class='plext'>00</div>
<div class='plext'>01</div>
<div class='plext'>02</div>
<div class='plext'>03</div>
<div class='plext'>04</div>
</div>
</div>
</div>
</div>
</body>";
var document = new HtmlDocument();
document.LoadHtml(html);
var textNodes = document.DocumentNode.SelectNodes(
    "//div[@id='pltexts']/div[@class='plext']/text()"
);
if (textNodes != null)
{
    foreach (var t in textNodes) Console.WriteLine(t.InnerText);
}

输出:

00
01
02
03
04

【讨论】:

  • 这可能很好,但我想从提供的网站加载它,而不仅仅是从变量中加载,因为我需要来自网站的这些数据。
  • @MassKos - uuuuhhhh....您可以轻松通过替换上面的html变量和HtmlDocument初始化代码。 HtmlWeb web = new HtmlWeb(); HtmlDocument doc = web.Load(url);doc.DocumentNode.SelectNodes(....
  • 我无法让这个东西工作......使用你的代码,它没有给我任何文本,什么也没有。这可能是因为我想从中获取文本的网站需要谷歌登录吗? (我确实通过 VisualStudio 和网络浏览器登录)
  • @MassKos,请分享本网站的网址。根据我的经验,Agility 在解析语法不正确的 HTML 时遇到了麻烦。一种解决方法是更改​​库的设置以忽略解析错误或运行用于更正 HTML 的外部工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2016-04-21
  • 2017-06-23
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多