সি # তে ওয়েবসাইট থেকে এইচটিএমএল কোড পান


89

কীভাবে কোনও ওয়েবসাইট থেকে এইচটিএমএল কোড পাবেন, এটি সংরক্ষণ করুন এবং একটি লিনকিউ এক্সপ্রেশন দিয়ে কিছু পাঠ্য পাবেন?

আমি একটি ওয়েব পৃষ্ঠার উত্স পেতে নিম্নলিখিত কোডটি ব্যবহার করছি:

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

4
আপনার এইচটিএমএল একবার ডিভ / পাঠ্য পেতে HTMLAgility প্যাক, ফিজলার বা সিএসকিউয়ারি ব্যবহার করে দেখুন অন্য কোনও কিছু খুব ত্রুটিযুক্ত।
জম্মাইকাম


@ জর্জিডুকেট যা এই প্রশ্নের সদৃশ বলে মনে হচ্ছে না, আপনি যে প্রশ্নটির সাথে লিঙ্ক করেছেন সেটি কেবল উত্স পুনরুদ্ধার সম্পর্কে, এই প্রশ্নটি ডিওএমকে জিজ্ঞাসাবাদ করার বিষয়েও।
মার্ক রোটভেল

@ মার্ক: দুঃখিত আপনি ঠিক বলেছেন, নীচে লেখাটি মিস করেছেন।
জর্জ ডেকেট

উত্তর:


113

একটি ওয়েবসাইট থেকে এইচটিএমএল কোড প্রাপ্ত করা। আপনি এই জাতীয় কোড ব্যবহার করতে পারেন।

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 কোডটি দেবে। তবে লিনকিউ এর মাধ্যমে পাঠ্য সন্ধান করা এত সহজ নয়। সম্ভবত নিয়মিত এক্সপ্রেশন ব্যবহার করা ভাল তবে এটি HTML কোডের সাথে ভাল খেলছে না


4
এইচটিএমএল বা এক্সএমএল-এর জন্য রেজেক্স ব্যবহারের ধারণাটি খুব খারাপ কোডিং অনুশীলন ... আপনার পথে চলছে - আমাদের সর্বত্র গোটো কীওয়ার্ডটি ব্যবহার করা উচিত ...
লাইটনিং 3

4
প্রকৃতপক্ষে, এইচটিএমএল কোডের মধ্যে একটি সুনির্দিষ্ট জিনিস অনুসন্ধান করতে রেজেক্স ব্যবহার করা খুব শালীন সমাধান হতে পারে। অন্যদিকে, রেইগেক্সের উপর ভিত্তি করে এইচটিএমএল পার্সার / ডায়রেক্টর তৈরির চেষ্টা করা খাঁটি উন্মাদনা হবে। এটি সমস্ত প্রেক্ষাপট এবং প্রকৃত টাস্কের উপর নির্ভর করে যা সম্পাদন করা প্রয়োজন, তবে "রেগেক্স কখনই এইচটিএমএল দিয়ে ভাল খেলেন না" বলা কোনও বিশ্বব্যাপী, অবিচ্ছেদ্য সত্য নয়। stackoverflow.com/a/1733489/6838730
ম্যাথিউকে VIALES

183

আপনার কাজটি সহজ করার জন্য আপনি ওয়েবক্লিয়েন্ট শ্রেণিটি আরও ভাল ব্যবহার করতে পারেন:

using System.Net;

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

কোন ধারণা কেন আমি এই ত্রুটি পেয়েছি? 'System.Net.WebClient': ব্যবহারের বিবৃতিতে ব্যবহৃত ধরণটি অবশ্যই 'System.IDisposable' - এ স্পষ্টরূপে রূপান্তরিত হতে হবে
ডেভ চ্যান্ডলার

10
জন্য using+1 টি: প্রয়োজন স্পষ্টত ব্যবহার সবার জন্য দেখানো
user3916429

যারা http 403 ত্রুটি পাচ্ছেন তাদের ক্লায়েন্ট যুক্ত করুন e আপনার পছন্দ মতো কোনও পাঠ্য দিয়ে ফিডলারের প্রতিস্থাপন করুন।
হিমাংশু প্যাটেল

37

ব্যবহারের সেরা জিনিস হ'ল এইচটিএমএলজিটিপ্যাক । পুনরুদ্ধার করা পৃষ্ঠা থেকে উপাদানগুলি নির্বাচনের জন্য আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনি ফিজার বা সিএসকিউয়ারি ব্যবহার করেও দেখতে পারেন । লিনকিউ বা রেগুকার এক্সপ্রেশনগুলি ব্যবহার করা ত্রুটিযুক্ত প্রবণতা, বিশেষত যখন এইচটিএমএলকে ত্রুটিযুক্ত হতে পারে, ক্লোজিং ট্যাগগুলি হারিয়ে যেতে পারে, বাচ্চাদের উপাদান থাকতে পারে ইত্যাদি when

আপনাকে পৃষ্ঠাটি এইচটিএমএল ডকুমেন্ট অবজেক্টে প্রবাহিত করতে হবে এবং তারপরে আপনার প্রয়োজনীয় উপাদানটি নির্বাচন করতে হবে।

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

[সম্পাদনা] আসলে, স্ক্র্যাপ। সবচেয়ে সহজ পদ্ধতি হ'ল ফিজারেলেক্স ব্যবহার করুন , মূল ফিজার প্রকল্পটির একটি আপডেট করা 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;
}

আমি মনে করি না এটি এর চেয়ে সহজতর কোনও পেতে পারে।


আমি যদি ওয়েব পৃষ্ঠায় একটি নির্দিষ্ট বোতামটি চাওয়া চাই? @ জম্মাইকাম
কে।

4
আপনি স্ক্রিন স্ক্র্যাপ আফিক দিয়ে এটি করতে পারবেন না, আপনাকে বোতামটি চাওয়ার জন্য সেলেনিয়ামের মতো কিছু ব্যবহার করতে হবে।
জম্মাইকাম

আপনি কিভাবে FizzlerEx ইনস্টল করবেন? আমি লিঙ্কটি পরীক্ষা করে দেখি এবং সেখানে একটি জিপ আছে তবে কোনও ইনস্টলার দেখতে পাচ্ছি না
হুয়ান কার্লোস অরোপেজা

6

আমি অ্যাঙ্গেলশার্প ব্যবহার করছি এবং এতে সন্তুষ্ট হয়েছি ।

এখানে কীভাবে একটি পৃষ্ঠা আনতে হবে তার একটি সাধারণ উদাহরণ:

var config = Configuration.Default.WithDefaultLoader();
var document = await BrowsingContext.New(config).OpenAsync("https://www.google.com");

এবং এখন আপনার ডকুমেন্ট ভেরিয়েবলের একটি ওয়েব পৃষ্ঠা রয়েছে । তারপরে আপনি লিনকিউ বা অন্যান্য পদ্ধতি দ্বারা সহজেই এটি অ্যাক্সেস করতে পারবেন। উদাহরণস্বরূপ আপনি যদি এইচটিএমএল টেবিল থেকে স্ট্রিংয়ের মান পেতে চান:

var someStringValue = document.All.Where(m =>
        m.LocalName == "td" &&
        m.HasAttribute("class") &&
        m.GetAttribute("class").Contains("pid-1-bid")
    ).ElementAt(0).TextContent.ToString();

সিএসএস নির্বাচনকারীদের ব্যবহার করতে দয়া করে অ্যাঙ্গেলশার্প উদাহরণ দেখুন


5

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

4
আপনার উত্তরে একটি চিত্রের পরিবর্তে কোড যুক্ত করা উচিত।
এজে

2

যে কোনও ইউআরএল এর জন্য এইচটিএমএল ডাউনলোড করতে আপনি ওয়েবক্লিয়েন্ট ব্যবহার করতে পারেন। একবার আপনি এইচটিএমএল আছে, আপনার মত একটি তৃতীয় পক্ষের গ্রন্থাগার ব্যবহার করতে পারেন HtmlAgilityPack কোড নিচে হিসেবে HTML এ মান অনুসন্ধান করতে -

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);
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.