Como obter o código HTML de um site, salvá-lo e localizar algum texto por uma expressão LINQ?
Estou usando o seguinte código para obter o código-fonte de uma página da 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;
}
Como encontro o texto em uma div na fonte da página da web?
Contains
ligação pode ser "boa o suficiente".Respostas:
Obtendo o código HTML de um site. Você pode usar um código como este.
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(); }
Isso fornecerá o código HTML retornado do site. Mas localizar texto via LINQ não é tão fácil. Talvez seja melhor usar uma expressão regular, mas isso não funciona bem com o código HTML
fonte
Melhor você pode usar a classe Webclient para simplificar sua tarefa:
using System.Net; using (WebClient client = new WebClient()) { string htmlCode = client.DownloadString("http://somesite.com/default.html"); }
fonte
using
requisito mostrado claramente para que todos possam usar: +1A melhor coisa a se usar é HTMLAgilityPack . Você também pode usar Fizzler ou CSQuery, dependendo de suas necessidades para selecionar os elementos da página recuperada. Usar LINQ ou Expressões Regukar está sujeito a erros, especialmente quando o HTML pode ser malformado, tags de fechamento ausentes, elementos filho aninhados etc.
Você precisa transmitir a página para um objeto HtmlDocument e, em seguida, selecionar o elemento necessário.
// 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] Na verdade, descarte isso. O método mais simples é usar FizzlerEx , uma implementação atualizada de seletores jQuery / CSS3 do projeto Fizzler original.
Amostra de código diretamente de seu 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; }
Não acho que possa ser mais simples do que isso.
fonte
Estou usando o AngleSharp e estou muito satisfeito com ele.
Aqui está um exemplo simples de como buscar uma página:
var config = Configuration.Default.WithDefaultLoader(); var document = await BrowsingContext.New(config).OpenAsync("https://www.google.com");
E agora você tem uma página da web na variável de documento . Em seguida, você pode acessá-lo facilmente por LINQ ou outros métodos. Por exemplo, se você deseja obter um valor de string de uma tabela HTML:
var someStringValue = document.All.Where(m => m.LocalName == "td" && m.HasAttribute("class") && m.GetAttribute("class").Contains("pid-1-bid") ).ElementAt(0).TextContent.ToString();
Para usar seletores CSS, consulte os exemplos do AngleSharp .
fonte
Aqui está um exemplo de como usar a
HttpWebRequest
classe para buscar um URLprivate 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(); }
fonte
Você pode usar o WebClient para baixar o html para qualquer url. Depois de ter o html, você pode usar uma biblioteca de terceiros como HtmlAgilityPack para pesquisar valores no html como no código abaixo -
public static string GetInnerHtmlFromDiv(string url) { string HTML; using (var wc = new WebClient()) { HTML = wc.DownloadString(url); } var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(HTML); HtmlNode element = doc.DocumentNode.SelectSingleNode("//div[@id='<div id here>']"); if (element != null) { return element.InnerHtml.ToString(); } return null; }
fonte
Experimente esta solução. Funciona bem.
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); }
fonte