Obtenir du texte entre toutes les balises d'un code HTML donné et parcourir de manière récursive les liens

c# html html-agility-pack web-crawler

Question

J'ai vérifié quelques articles sur le dépassement de capacité de la pile pour obtenir tous les mots entre toutes les balises html! Tous m'ont confondu! certaines personnes recommandent l'expression régulière spécifiquement pour une seule balise, tandis que d'autres ont mentionné les techniques d'analyse syntaxique! essaie fondamentalement de faire un robot Web! pour cela, j'ai le code HTML du lien que j'ai récupéré dans mon programme dans une chaîne! J'ai également extrait les liens du code HTML que j'ai stocké dans ma chaîne de données! Maintenant, je veux parcourir la profondeur et extraire des mots sur la page de tous les liens que j'ai extraits de ma chaîne! J'ai deux questions! Comment puis-je récupérer les mots sur chacune des pages Web en ignorant les balises et le script java? Deuxièmement, comment pourrais-je explorer récursivement les liens?

Voici comment obtenir du code HTML dans la chaîne:

public void getting_html_code_of_link()
    {
        string urlAddress = "http://google.com";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        if (response.StatusCode == HttpStatusCode.OK)
        {
            Stream receiveStream = response.GetResponseStream();
            StreamReader readStream = null;
            if (response.CharacterSet == null)
                readStream = new StreamReader(receiveStream);
            else
                readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
            data = readStream.ReadToEnd();
            response.Close();
            readStream.Close();
            Console.WriteLine(data);
        }
    }

Et voici comment extraire des références de lien à partir de l’URL que je donne:

public void regex_ka_kaam()
    {
        StringBuilder sb = new StringBuilder();
        //Regex hrefs = new Regex("<a href.*?>");
        Regex http = new Regex("http://.*?>");

        foreach (Match m in http.Matches(data))
        {
            sb.Append(m.ToString());
            if (http.IsMatch(m.ToString()))
            {

                sb.Append(http.Match(m.ToString()));
                sb.Append("                                                                        ");
                //sb.Append("<br>");
            }
            else
            {
                sb.Append(m.ToString().Substring(1, m.ToString().Length - 1)); //+ "<br>");
            }
        }
        Console.WriteLine(sb);
    }

Réponse populaire

Regex n'est pas un bon choix pour analyser les fichiers HTML.

HTML n'est pas strict ni régulier avec son format.

Utilisez htmlagilitypack


Ceci extrait tous les liens de la page web

public List<string> getAllLinks(string webAddress)
{
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlDocument newdoc=web.Load(webAddress);

    return doc.DocumentNode.SelectNodes("//a[@href]")
              .Where(y=>y.Attributes["href"].Value.StartsWith("http"))
              .Select(x=>x.Attributes["href"].Value)
              .ToList<string>();
}

cela obtient tout le contenu sauf les balises dans le HTML

public string getContent(string webAddress)
{
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlDocument doc=web.Load(webAddress);

    return string.Join(" ",doc.DocumentNode.Descendants().Select(x=>x.InnerText));
}

cette rampe à travers tous les liens

public void crawl(string seedSite)
{
        getContent(seedSite);//gets all the content
        getAllLinks(seedSite);//get's all the links
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow