98 votes

Comment trouver le texte à l'intérieur d'un div dans la source d'une page Web en utilisant C# ?

Comment puis-je obtenir le HTML à partir d'un site web, l'enregistrer, et trouver du texte en utilisant un outil de recherche. LINQ expression ?

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 à l'intérieur d'un div dans le source de la page web ?

187voto

skumar Points 3144

Pour simplifier votre tâche, vous pouvez utiliser la classe Webclient :

using System.Net;

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

119voto

SyntaxError Points 304

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 (String.IsNullOrWhiteSpace(response.CharacterSet))
        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 retour HTML du site web. Mais trouvez le texte via LINQ n'est pas si facile. Il est peut-être préférable d'utiliser des expressions régulières, mais cela n'est pas compatible avec l'utilisation de HTML .

39voto

jammykam Points 15817

La meilleure chose à utiliser est HTMLAgilityPack . Vous pouvez également envisager d'utiliser Fizzler o CSQuery en fonction de vos besoins pour sélectionner les éléments de la page récupérée. L'utilisation de LINQ ou d'expressions Regukar est trop sujette aux erreurs, en particulier lorsque le HTML peut être mal formé, qu'il manque des balises de fermeture, que des éléments enfants sont imbriqués, etc.

Vous devez transformer la page en 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, laissez tomber. La méthode la plus simple est d'utiliser FizzlerEx Fizzler, une mise en œuvre actualisée des sélecteurs jQuery/CSS3 du projet original Fizzler.

Exemple de code provenant directement de 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 ça puisse être plus simple que ça.

8voto

Tickseeker Points 141

J'utilise AngleSharp et j'en suis très satisfait.

Voici un exemple simple de récupération d'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. Vous pouvez ensuite y accéder facilement par LINQ ou d'autres méthodes. Par exemple, si vous voulez obtenir une valeur de chaîne de caractères à 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 .

6voto

Mohamed Sayed Points 61

Voici un exemple d'utilisation de la fonction HttpWebRequest pour récupérer 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(); 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X