DocumentNode.SelectSingleNode返回null

时间:2018-11-02 04:21:18

标签: html-agility-pack

我想使用HtmlAgilityPack获取此网址“ https://www.toutiao.com/a6619068128406028804/”的时间,我的代码如下:

string url = "https://www.toutiao.com/a6619068128406028804/" 
HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load(url);

HtmlNode node_time= doc.DocumentNode.SelectSingleNode("/html/body/div[1]/div[2]/div[2]/div[1]/div[1]/span[2]");
time = node_time.InnerText.Trim();

node_time始终为空,如何获取时间标记的内容?

1 个答案:

答案 0 :(得分:0)

问题不在于xPath选择器,而是这些元素在客户端呈现的事实。如果查看实际的初始get请求(可以在chrome / fiddler / ext中执行此操作),则会看到这些元素不存在。但是,在“ BASE_DATA” json字符串内有一个“ articleInfo” json对象被发送回。通常,您需要解析该字符串,然后反序列化它,然后就有一个结构化对象可以从中获取数据。我通常使用Visual Studio Paste作为类功能,但是这似乎有点复杂,并且在您的问题范围之外。

还要注意,该对象确实已加载到javascript中,但是您无法使用HAP访问该对象,如果使用无头浏览器,则可以使用execute javascript功能直接访问该对象。

因此,基本上,您可以手动解析json字符串,也可以切换到诸如无头浏览器之类的实际执行JavaScript的东西。