【问题标题】:HtmlAgilityPack DocumentNode.ChildNodes returns empty nodesHtmlAgilityPack DocumentNode.ChildNodes 返回空节点
【发布时间】:2018-06-05 19:33:28
【问题描述】:

我用 Java 为 price comparison site 构建了一个网站爬虫,并希望用 C# 重新实现它。我在 Java 中使用了 Jsoup,而 HtmlAgilityPack (HAP) 是 .NET 的一个很好的对应物。在爬取了这个site 的示例产品后,我注意到HAP 返回了空的html 节点。当我查看该站点的源代码时,它们不是原始 html 的一部分。该节点仅包含格式符号,如"\n\t\t\t\t"。 Jsoup 没有表现出这种行为,所以我很好奇 HAP 在那里做了什么。我如何检索节点的小代码示例:

using Fizzler.Systems.HtmlAgilityPack; // Without that I can't retrieve nodes 
                                      // by searching for a certain class
[...]
var client = new WebClient()
{
    Encoding = Encoding.UTF8
};
var doc = new HtmlDocument();
var html = client.DownloadString("https://www.idealo.de/preisvergleich/OffersOfProduct/5473234);
doc.LoadHtml(html);
var root = doc.DocumentNode;
var data = root.QuerySelector(".pageContent-wrapper").FirstChild;

此代码返回一个以"\n\t\t\t\t" 作为内容的空节点,而它应该返回一个带有javascript 内容的脚本节点。

关键的 html 部分:

<main class="pageContent-wrapper">
<!-- Here is nothing!-->
            <script type="application/ld+json">{...json...}</script>

为什么&lt;script&gt; 不是直接子节点,而是某个空节点?

【问题讨论】:

    标签: c# web-crawler html-agility-pack


    【解决方案1】:

    好像你想得到这个json

    var json = root.SelectSingleNode("//*[@class='pageContent-wrapper']/script").InnerText;
    var jobj = JObject.Parse(json);
    

    【讨论】:

    • NonetheIess 我不明白为什么 HAP 在
    • 如果是问题,我不明白你在问什么。顺便说一句:你为​​什么不在继续之前尝试上面的代码
    • 在我的
      节点上方的代码中可用作变量 data... 所以逻辑上
      节点的 FirstChild 应该是
    • 所以,#text 是第一个包含这些空字符的节点,而不是脚本。你有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多