Получить HTML код с сайта в C#
Как получить HTML-код с веб-сайта, сохранить его и найти текст с помощью выражения LINQ?
Я использую следующий код, чтобы получить исходный код веб-страницы:
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;
}
Как найти текст в div в источнике веб-страницы?
6 ответов:
получение HTML кода с сайта. Вы можете использовать такой код.
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(); }Это даст вам возвращены HTML код с сайта. Но найти текст через LINQ - это не так просто. Возможно, лучше использовать регулярное выражение, но это не очень хорошо играет с HTML код
лучше вы можете использовать класс Webclient для упрощения вашей задачи:
using System.Net; using (WebClient client = new WebClient()) { string htmlCode = client.DownloadString("http://somesite.com/default.html"); }
лучше использовать HTMLAgilityPack. Вы также можете посмотреть на использование Fizzler или CSQuery в зависимости от ваших потребностей для выбора элементов из полученной страницы. Использование выражений LINQ или Regukar просто подвержено ошибкам, особенно когда HTML может быть искажен, отсутствуют закрывающие теги, имеют вложенные дочерние элементы и т. д.
вам нужно передать страницу в объект HtmlDocument, а затем выбрать нужный элемент.
// 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();[редактирование] Вообще-то, брось это. Самый простой способ-использовать FizzlerEx, обновленная реализация jQuery / CSS3-селекторов оригинального проекта Fizzler.
пример кода прямо со своего сайта:
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; }Я не думаю, что это может быть проще, чем это.
вот решение в том, как получить ваш.
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(); }
Я использую AngleSharp и были очень довольны.
вот простой пример, как получить страницу:
var config = Configuration.Default.WithDefaultLoader(); var document = await BrowsingContext.New(config).OpenAsync("https://www.google.com");и теперь у вас есть веб-страницы документ переменной. Затем вы можете легко получить к нему доступ с помощью LINQ или другими методами. Например, если вы хотите получить строковое значение из таблицы HTML:
var someStringValue = document.All.Where(m => m.LocalName == "td" && m.HasAttribute("class") && m.GetAttribute("class").Contains("pid-1-bid") ).ElementAt(0).TextContent.ToString();для использования селекторов CSS см. примеры AngleSharp.
попробуйте это решение. Он отлично работает.
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); }

Comments