웹 사이트에서 C #으로 HTML 코드 가져 오기
웹 사이트에서 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에서 텍스트를 어떻게 찾습니까?
웹 사이트에서 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 Expressions를 사용하면 오류가 발생하기 쉽습니다. 특히 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();
[편집] 사실, 스크랩. 가장 간단한 방법은 원래 Fizzler 프로젝트의 업데이트 된 jQuery / CSS3 선택기 구현 인 FizzlerEx 를 사용 하는 것입니다.
해당 사이트에서 직접 코드 샘플 :
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;
}
나는 그것이 그것보다 더 간단해질 수 있다고 생각하지 않습니다.
다음 HttpWebRequest
은 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();
}
I am using AngleSharp and have been very satisfied with it.
Here is a simple example how to fetch a page:
var config = Configuration.Default.WithDefaultLoader();
var document = await BrowsingContext.New(config).OpenAsync("https://www.google.com");
And now you have a web page in document variable. Then you can easily access it by LINQ or other methods. For example if you want to get a string value from a HTML table:
var someStringValue = document.All.Where(m =>
m.LocalName == "td" &&
m.HasAttribute("class") &&
m.GetAttribute("class").Contains("pid-1-bid")
).ElementAt(0).TextContent.ToString();
To use CSS selectors please see AngleSharp examples.
Try this solution. It works fine.
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);
}
참고URL : https://stackoverflow.com/questions/16642196/get-html-code-from-website-in-c-sharp
'IT박스' 카테고리의 다른 글
C / C ++의 최소 double 값 (0) | 2020.10.13 |
---|---|
결합하는 방법 || (0) | 2020.10.13 |
Backbone.js REST 호출 이해 (0) | 2020.10.13 |
자동 완성이 android sdk에서 작동을 중지했습니다. (0) | 2020.10.13 |
Java Generics에서 'super'와 'extends'의 차이점은 무엇입니까 (0) | 2020.10.13 |