web-dev-qa-db-fra.com

Obtenir le code HTML du site Web en C #

Comment obtenir le code HTML d'un site Web, le sauvegarder et trouver du texte avec une expression LINQ?

J'utilise le code suivant pour obtenir la source d'une page Web:

public static String code(string Url)
{
    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
    myRequest.Method = "GET";
    WebResponse myResponse = myRequest.GetResponse();
    StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
    string result = sr.ReadToEnd();
    sr.Close();
    myResponse.Close();

    return result;
 }

Comment trouver le texte dans un div dans le source de la page Web?

75
ggcodes

Obtenir le code HTML d'un site Web. Vous pouvez utiliser un code comme celui-ci.

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

  string data = readStream.ReadToEnd();

  response.Close();
  readStream.Close();
}

Cela vous donnera le code HTML renvoyé sur le site. Mais trouver du texte via LINQ n’est pas si facile. Il est peut-être préférable d’utiliser une expression régulière, mais cela ne fonctionne pas bien avec le code HTML

103
SyntaxError

Mieux, vous pouvez utiliser la classe Web Client pour simplifier votre tâche:

using System.Net;

using (WebClient client = new WebClient())
{
    string htmlCode = client.DownloadString("http://somesite.com/default.html");
}
156
Santosh Panda

La meilleure chose à utiliser est HTMLAgilityPack . Vous pouvez également envisager d'utiliser Fizzler ou CSQuery en fonction de vos besoins pour la sélection des éléments à partir de la page récupérée. L'utilisation de LINQ ou de Regukar Expressions n'est que source d'erreur, en particulier lorsque le code HTML peut être mal formé, qu'il manque des balises de fermeture, que des éléments enfants sont imbriqués, etc.

Vous devez diffuser la page dans un objet HtmlDocument, puis sélectionner l'élément requis.

// Call the page and get the generated HTML
var doc = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNode.ElementsFlags["br"] = HtmlAgilityPack.HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;

try
{
    var webRequest = HttpWebRequest.Create(pageUrl);
    Stream stream = webRequest.GetResponse().GetResponseStream();
    doc.Load(stream);
    stream.Close();
}
catch (System.UriFormatException uex)
{
    Log.Fatal("There was an error in the format of the url: " + itemUrl, uex);
    throw;
}
catch (System.Net.WebException wex)
{
    Log.Fatal("There was an error connecting to the url: " + itemUrl, wex);
    throw;
}

//get the div by id and then get the inner text 
string testDivSelector = "//div[@id='test']";
var divString = doc.DocumentNode.SelectSingleNode(testDivSelector).InnerHtml.ToString();

[EDIT] En fait, mettez ça au rebut. La méthode la plus simple consiste à utiliser FizzlerEx , une implémentation mise à jour de jQuery/CSS3-selectors du projet Fizzler d'origine.

Exemple de code directement depuis leur site:

using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;

//get the page
var web = new HtmlWeb();
var document = web.Load("http://example.com/page.html");
var page = document.DocumentNode;

//loop through all div tags with item css class
foreach(var item in page.QuerySelectorAll("div.item"))
{
    var title = item.QuerySelector("h3:not(.share)").InnerText;
    var date = DateTime.Parse(item.QuerySelector("span:eq(2)").InnerText);
    var description = item.QuerySelector("span:has(b)").InnerHtml;
}

Je ne pense pas que cela puisse être plus simple que cela.

37
jammykam

Voici un exemple d'utilisation de la classe HttpWebRequest pour extraire une URL

private void buttonl_Click(object sender, EventArgs e) 
{ 
    String url = TextBox_url.Text;
    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
    HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 
    StreamReader sr = new StreamReader(response.GetResponseStream()); 
    richTextBox1.Text = sr.ReadToEnd(); 
    sr.Close(); 
} 
4
Mohamed Sayed

J'utilise AngleSharp et en ai été très satisfait.

Voici un exemple simple pour récupérer une page:

var config = Configuration.Default.WithDefaultLoader();
var document = await BrowsingContext.New(config).OpenAsync("https://www.google.com");

Et maintenant, vous avez une page Web dans document variable. Ensuite, vous pouvez facilement y accéder par LINQ ou d’autres méthodes. Par exemple, si vous souhaitez obtenir une valeur de chaîne à partir d'un tableau HTML:

var someStringValue = document.All.Where(m =>
        m.LocalName == "td" &&
        m.HasAttribute("class") &&
        m.GetAttribute("class").Contains("pid-1-bid")
    ).ElementAt(0).TextContent.ToString();

Pour utiliser les sélecteurs CSS, veuillez consulter exemples d'AngleSharp .

3
Tickseeker

Essayez cette solution. Ça fonctionne bien.

 try{
        String url = textBox1.Text;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream());
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(sr);
        var aTags = doc.DocumentNode.SelectNodes("//a");
        int counter = 1;
        if (aTags != null)
        {
            foreach (var aTag in aTags)
            {
                richTextBox1.Text +=  aTag.InnerHtml +  "\n" ;
                counter++;
            }
        }
        sr.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed to retrieve related keywords." + ex);
        }
1
youssef