Comment identifier si le tweet est original ou retweet en grattant HtmlAgilityPack

c# filter html-agility-pack tweetr web-scraping

Question

Je voulais les tweets de l'utilisateur Twitter pour l'analyse des données. Pour cela, j'ai utilisé le paquet HtmlAgilityPack pour gratter Twitter et cela me donne 30 meilleurs tweets.

J'ai reconnu l'élément tweet-text et récupéré tous les tweets. Mais je veux identifier s'il s'agit d'un tweet ou d'un retweet. Comment puis je faire ça?

J'ai analysé le HTML. Dans le retweet, il y aura un élément ayant la classe tweet-context with-icn . Mais lorsque je gratte un tweet sur cette classe, il lève une exception nulle, car tous les tweets n'auront pas cette classe. Ensuite, en fonction de quoi et comment puis-je gratter pour savoir s'il est retweet ou non?

Code:

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

Dans le code ci-dessus, j'ai essayé de récupérer des tweets du profil de Barack Obama. Je reçois les 30 meilleurs tweets. Comment savoir lequel est retweet?
Je vous remercie.

Réponse acceptée

Gratter Twitter 101

  1. Obtenez tous les tweets d'une page (qui se présente sous forme de tableaux pratiques <table class='tweet '> )

    HtmlWeb p = new HtmlWeb();
    var doc = p.Load(@"https://twitter.com/dailygametips");
    var nodes = doc.DocumentNode.SelectNodes("//table[@class='tweet  ']");
    
  2. Recherchez dans les nœuds le <span class='context'> indiquant que ce tweet est un retweet.

    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. Nous voulons aussi le texte du message, alors supprimez ce prochain <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));
    }
    

Ajout de la classe de conteneur Tweet:

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

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

Comme vous le dites, ce n'est pas vraiment sorcier. Mais vous devez comprendre les principes de base de XPath et Scrapping.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi