DocumentNode.SelectSingleNode возвращает ноль - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу получить время этого URL "https://www.toutiao.com/a6619068128406028804/" с HtmlAgilityPack, мой код выглядит следующим образом:

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 голосов
/ 02 ноября 2018

Проблема не в селекторе xPath, а в том, что эти элементы отображаются на стороне клиента. Если вы посмотрите на фактический начальный запрос get (можете сделать это в chrome / fiddler / ext), то увидите, что этих элементов там нет. Однако внутри json-строки "BASE_DATA" есть объект articleInfo, который отправляется обратно. Обычно вы хотите разобрать эту строку и затем десериализовать ее, тогда у вас есть структурированный объект для извлечения данных. Обычно я использую Visual Studio Paste в качестве функции классов, но это кажется довольно сложным для этого и в основном выходит за рамки вашей проблемы с этим.

Также отметим, что объект загружается в javascript, но вы не можете получить к нему доступ через HAP, если вы использовали браузеры без заголовка, вы могли бы получить доступ к этому объекту напрямую, используя функции execute javascript.

Таким образом, вы можете либо проанализировать строку json вручную, либо переключиться на что-то вроде безголового браузера, где фактически выполняется javascript.

...