在C#中从网站获取HTML代码
如何从网站获取HTML代码,保存并通过LINQexpression式find一些文本?
我正在使用下面的代码来获取网页的来源:
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; }
如何在网页的源代码中finddiv中的文本?
从网站获取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查找文本并不那么容易。 也许最好是使用正则expression式,但是HTML代码不能很好地运行
更好的是你可以使用Webclient类来简化你的任务:
using System.Net; using (WebClient client = new WebClient()) { string htmlCode = client.DownloadString("http://somesite.com/default.html"); }
最好的事情是HTMLAgilityPack 。 您也可以使用Fizzler或CSQuery来根据您的需要从检索到的页面中select元素。 使用LINQ或Regukarexpression式只是容易出错,尤其是当HTML格式错误,缺less结束标签,嵌套子元素等。
您需要将页面stream式传输到HtmlDocument对象中,然后select所需的元素。
// 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 ,一个更新的原始Fizzler项目的jQuery / CSS3select器实现。
代码示例直接从他们的网站:
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; }
我认为它不会比这更简单。
这是如何获得您的解决scheme。
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");
现在你有一个文件variables的网页。 那么你可以通过LINQ或其他方法轻松访问它。 例如,如果你想从HTML表中获取一个string值:
var someStringValue = document.All.Where(m => m.LocalName == "td" && m.HasAttribute("class") && m.GetAttribute("class").Contains("pid-1-bid") ).ElementAt(0).TextContent.ToString();
要使用CSSselect器,请参阅AngleSharp示例 。
试试这个解决scheme 它工作正常。
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); }