如何在使用 HtmlAgilityPack 抓取时识别推文是原创推文还是转推文?

How to identify if tweet is original or retweet in scraping with HtmlAgilityPack?

我想要用户的 Twitter 推文进行数据分析。为此,我使用 HtmlAgilityPack 包来抓取 Twitter,它给了我 30 个热门推文。

我识别出推文文本元素并获取了所有推文。但我想确定它是推文还是转推。我该怎么做?

我分析过HTML。在转发中将有一个元素具有 tweet-context with-icn class。但是当我在 class 上抓取推文时,它会抛出 null 异常,因为并非所有推文都会有 class。然后根据什么以及如何去了解它是否被转发?

代码:

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 条推文。我如何识别转推的推文?
谢谢。

抓取 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));
    }
    

其他推文容器 Class:

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

    string Message { get; private set; }
    bool IsRetweet { get; private set; }
}

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