我试图阅读聊天网站https://tlk.io/上的消息,您可以在其中选择随机频道并输入对话。 现在,我想通过C#中的HTML Agility提取书面消息。 因此,消息的xpath例如:/ html / body / div / section / dl [19] / dd [3]。 所以我试图在div中搜索所有消息 这是我的123频道代码:
var url = "https://tlk.io/123";
var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(url);
var HtmlDocument = new HtmlDocument();
HtmlDocument.LoadHtml(html);
var Messages = HtmlDocument.DocumentNode.Descendants("div")
.Where(node => node.GetAttributeValue("class", "")
.Equals("chat")).ToList();
现在的问题是我在给定的xpath中找不到消息。
答案 0 :(得分:0)
邮件不在检索的html中,因为它们是在初始html加载后动态加载的。
我对tlk.io一无所知,但在幕后似乎要查询一些API,该API返回包含聊天消息的JSON消息(以它们的价值为准...)。因此,您可以利用它来获取信息。例如;
using (WebClient webClient = new WebClient())
{
var html = webClient.DownloadString("https://tlk.io/123");
Match chatIdFinder = new Regex(@"Talkio\.Variables\.chat_id = '(?<chatid>\d+)'").Match(html);
if (!chatIdFinder.Success) throw new ArgumentException("Could not find chat id");
var chatId = chatIdFinder.Groups["chatid"].Value;
var json = webClient.DownloadString($"https://tlk.io/api/chats/{chatId}/messages");
JArray messages = JArray.Parse(json);
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
foreach (dynamic message in messages)
{
JToken chatMessage = message.body;
JToken nickname = message.nickname;
JToken timestamp = message.timestamp;
var messageTime = epoch.AddSeconds(timestamp.Value<int>()).ToLocalTime();
Console.WriteLine($"{messageTime}: {nickname.Value<string>()}: {chatMessage.Value<string>()}");
}
}