我想要用户的Twitter推文进行数据分析。为此,我使用HtmlAgilityPack包来抓取Twitter,它给了我30条推文。
我识别了tweet-text元素并获取了所有推文。但我想确定它是推文还是推特。我怎么能这样做?
我分析了HTML。转发时会有一个tweet-context with-icn
类的元素。但是,当我在该类上抓取推文时,它会抛出null异常,因为并非所有的推文都会有该类。然后根据什么以及如何刮取以了解它是否转发?
代码:
HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("https://twitter.com/BarackObama");
var TweetsNode= doc.DocumentNode.SelectNodes("//tr[@class='tweet-container']").ToList();
foreach (var item in TweetsNode)
{
var tweet = new Tweets
{
console.WriteLine(item.innertext);
};
}
在上面的代码中,我试图获取巴拉克奥巴马简介的推文。我获得了前30条推文。我如何识别转推哪一个? 谢谢。
答案 0 :(得分:1)
从一个页面获取所有推文(方便的表<table class='tweet '>
)
HtmlWeb p = new HtmlWeb();
var doc = p.Load(@"https://twitter.com/dailygametips");
var nodes = doc.DocumentNode.SelectNodes("//table[@class='tweet ']");
在节点中查找<span class='context'>
以表明此推文是转推。
List<Tweet> tweets = new List<Tweet>();
foreach (var node in nodes)
{
bool isRetweet = false;
var spanNode = node.SelectSingleNode(".//span[@class='context']");
if (spanNode != null && spanNode.InnerHtml.Contains("retweeted"))
{
isRetweet = true;
}
我们还想要消息文本,因此请先删除<div class='tweet-text'>
:
string msg = string.Empty;
var msgNode = node.SelectSingleNode(".//div[@class='tweet-text']");
if (msgNode != null)
{
msg = msgNode.InnerText.Trim();
}
tweets.Add(new Tweet(msg, isRetweet));
}
增加推文容器类:
class Tweet
{
public Tweet(string message, bool isRetweet)
{
Message = message;
IsRetweet = isRetweet;
}
string Message { get; private set; }
bool IsRetweet { get; private set; }
}
正如你所说,这不是真正的火箭科学。但是你需要了解XPath和Scrapping的基本原理。