如何使用HtmlAgilityPack识别推文是原创的还是转推的?

时间:2018-06-11 13:14:09

标签: c# filter web-scraping html-agility-pack tweetr

我想要用户的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条推文。我如何识别转推哪一个? 谢谢。

1 个答案:

答案 0 :(得分:1)

刮刮Twitter 101

  1. 从一个页面获取所有推文(方便的表<table class='tweet '>

    HtmlWeb p = new HtmlWeb();
    var doc = p.Load(@"https://twitter.com/dailygametips");
    var nodes = doc.DocumentNode.SelectNodes("//table[@class='tweet  ']");
    
  2. 在节点中查找<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;
        }
    
  3. 我们还想要消息文本,因此请先删除<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));
    }
    
  4. 增加推文容器类:

    class Tweet
    {
        public Tweet(string message, bool isRetweet)
        {
            Message = message;
            IsRetweet = isRetweet;
        }
    
        string Message { get; private set; }
        bool IsRetweet { get; private set; }
    }
    

    正如你所说,这不是真正的火箭科学。但是你需要了解XPath和Scrapping的基本原理。