C # में वेबसाइट से HTML कोड प्राप्त करें


87

वेबसाइट से 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;
 }

मुझे वेब पेज के स्रोत में एक डिव में पाठ कैसे मिल सकता है?


निर्भर करता है कि स्मार्ट खोज कैसे होनी चाहिए। एक साधारण Containsकॉल "काफी अच्छा" हो सकता है।
ashes999

5
HTML / HTML, एक बार जब आपके पास HTML हो, तो DivA / टेक्स्ट प्राप्त करने के लिए HTMLAgility पैक, Fizzler या CSQuery का उपयोग करें।
जाम्यकमम


@GeorgeDuckett जो इस प्रश्न के डुप्लिकेट की तरह नहीं दिखता है, आपके द्वारा लिंक किया गया प्रश्न केवल स्रोत को पुनः प्राप्त करने के बारे में है, यह प्रश्न DOM को क्वेरी करने के बारे में भी है।
मार्क रोटेटेवेल

@Mark: क्षमा करें, आप काफी सही हैं, सबसे नीचे पाठ याद किया।
जॉर्ज डकेट

जवाबों:


112

एक वेबसाइट से 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 (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();
}

यह आपको वेबसाइट से लौटा HTML कोड देगा। लेकिन LINQ के माध्यम से टेक्स्ट ढूंढना इतना आसान नहीं है। शायद नियमित अभिव्यक्ति का उपयोग करना बेहतर है लेकिन यह HTML कोड के साथ अच्छा नहीं खेलता है


4
Html या XML के लिए रेगेक्स का उपयोग करने का विचार बहुत बुरा कोडिंग अभ्यास है ... आपके रास्ते में जा रहा है - हमें हर जगह गोटो कीवर्ड का उपयोग करना चाहिए ...
लाइटनिंग 3

वास्तव में, HTML कोड के भीतर एक सटीक चीज़ खोजने के लिए regex का उपयोग करना एक बहुत ही सभ्य समाधान हो सकता है। दूसरी ओर, रेगेक्स के आधार पर एक HTML पार्सर / व्याख्याकार बनाने का प्रयास, शुद्ध पागलपन होगा। यह सब उस संदर्भ और वास्तविक कार्य पर निर्भर करता है जिसे करने की आवश्यकता है, लेकिन यह कहना कि "रेगेक्स कभी भी HTML के साथ अच्छा नहीं खेलता है" बस एक वैश्विक, अकल्पनीय सत्य नहीं है। stackoverflow.com/a/1733489/6838730
मैथ्यू शीट्स

177

अपने कार्य को सरल बनाने के लिए आप बेहतर वेबक्लायंट क्लास का उपयोग कर सकते हैं:

using System.Net;

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

किसी भी विचार मुझे यह त्रुटि क्यों मिली? 'System.Net.WebClient': टाइपिंग स्टेटमेंट में उपयोग किए जाने वाले प्रकार को 'System.IDis प्रयोज्य' के लिए विशेष रूप से परिवर्तनीय होना चाहिए
डेव चैंडलर

9
के लिए using+1: आवश्यकता जाहिर है उपयोग करने के लिए हर किसी के लिए दिखाया गया है
user3916429

37

HTMLAgilityPack का उपयोग करने के लिए सबसे अच्छी बात है । आप पुनः प्राप्त पृष्ठ से तत्वों का चयन करने के लिए अपनी आवश्यकताओं के आधार पर फ़िज़लर या CSQuery का उपयोग भी कर सकते हैं । LINQ या रेगुकर एक्सप्रेशंस का उपयोग करना केवल प्रवण त्रुटि है, विशेष रूप से जब 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- चयनकर्ता मूल फ़िज़लर परियोजना का कार्यान्वयन।

कोड नमूना सीधे उनकी साइट से:

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;
}

मुझे नहीं लगता कि इससे कोई सरल हो सकता है।


क्या होगा अगर मैं वेब पेज पर एक विशिष्ट बटन लागू करना चाहता हूं? @ जम्मीकम
कामरान

1
आप ऐसा नहीं कर सकते हैं कि स्क्रीन स्क्रैपर के साथ, आपको बटन को लागू करने के लिए सेलेनियम जैसी किसी भी चीज़ का उपयोग करना होगा।
जाम्यकम jam

आप FizzlerEx कैसे स्थापित करते हैं? मैं लिंक की जाँच करता हूँ और वहाँ एक .zip है, लेकिन किसी भी इंस्टॉलर को नहीं देखें
जुआन कार्लोस ओरोपेज़ा

5

मैं 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 उदाहरण देखें ।


5

यहां HttpWebRequestURL प्राप्त करने के लिए कक्षा का उपयोग करने का एक उदाहरण है

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(); 
} 

2
आपको एक छवि के बजाय अपने उत्तर में कोड जोड़ना चाहिए।
एजे

2

किसी भी url के लिए html डाउनलोड करने के लिए आप WebClient का उपयोग कर सकते हैं। एक बार आपके पास html हो जाने के बाद, आप HTML में मूल्यों को देखने के लिए HtmlAgilityPack जैसी थर्ड-पार्टी लाइब्रेरी का उपयोग कर सकते हैं जैसे कि नीचे दिए गए कोड में -

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;            
    }

1

इस समाधान की कोशिश करो। यह बढ़िया काम करता है।

 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);
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.