استخراج متن توسط Regex در #C
یکشنبه 11 مرداد 1394در این مقاله می خواهیم نشان دهیم که چگونه از یک وب سایت، یک متن خاص را استخراج کنیم. متن ها به روش های خاصی می توانند از یک وب سایت استخراج شوند.
در این مقاله می خواهیم دو روش ساده برای این کار را نشان دهیم. که عبارتند از:کلاس WebClient و
کلاس WebRequest / WebResponse
در اینجا، ما با استفاده از دو کلاس ذکر شده، میخواهیم عنوان سایت های مدنظرمان را به دست بیاوریم.
توضیح کدها را با استفاده از کلاس WebClient شروع خواهیم کرد.
این کلاس متدهای عمومی را برای ارسال و دریافت داده از هر منبع اینترنتی یا محلی که با آدرس URL مشخص شده است، فراهم می کند.
متدهای WebClient، روش های مختلفی برای دانلود داده از URL را دارند. اما ما می خواهیم از یک متد DownloadString استفاده کنیم.
متد DownloadString این امکان را می دهد که بتوانیم یک رشته (String) را از هر مکانی که آدرس آن را مشخص کرده ایم دانلود کنیم و مقدار آن را به ما برگرداند.
به کدهای زیر توجه کنید:
WebClient wb= new WebClient(); String searchquery=textBox1.Text; String scrapdata; scrapdata=wb.DownloadString(searchquery);
کدهایی که در بالا نوشتیم، این کارها را انجام می دهد:
برای کلاس WebClient، شی wb را ساختیم. شی wb با استفاده از متد DownlodString، رشته را از آدرسی که به آن داده ایم دانلود می کند. سپس رشته ای را که می خواهیم اطلاعات آن را به اصطلاح، بیرون بکشیم را، برمی گرداند. این کد، تنها کد منبع (source code) وب سایت را دانلود می کند. ما با استفاده از Regex، متن مورد نظرمان را از کد منبع جدا می کنیم.
Regex
Regex مخفف Regular Expression می باشد. Regex یک الگو است که می تواند با متن ورودی مطابقت داشته باشد.
قبل از اینکه بتوانیم از Regex استفاده کنیم، باید فضای نام آن را به کد برنامه خود اضافه کنیم.
using System.Text.RegularExpressions;
ما می خواهیم از Regex.Matches استفاده کنیم.
Regex.Matches، چندین شی همتا را برمی گرداند. چند نمونه از یک الگو را با هم مطابقت داده و یک MatchCollection برمی گرداند. اگر مقادیر زیادی انتظار می رود، برای استخراج مقادیر برپایه یک الگو، این، بسیار سودمند است.
Regex.Matches، متنی را که در داخل تگ مشخص کردیم را استخراج می کند. به کد زیر نگاه کنید:
MatchCollection data=Regex.Matches(scrapdata,@"<title>\s*(.+?)\s*</title>",RegexOptions.Singleline);
در اینجا، متنی را که در داخل تگ title است را استخراج کردیم.
گزینه RegexOptions.Singleline یا گزینه s باعث می شود که Regular Expression رشته های ورودی را که شامل یک خط باشند را اصلاح کند. این کار با تغییر رفتار المنت زبان نقطه (.) انجام می شود. بنابراین بجای انطباق کاراکترها از خط جدید n\، هر کاراکتر را انطباق می دهد.
سپس از حلقه foreach برای پیدا کردن مقدار دقیق استفاده می کنیم.
کدهای زیر را ببینید:
foreach (Match m in data) { String downtitle = m.Groups[1].Value; MessageBox.Show(downtitle.ToString()); }
در شکل زیر، دو مقدار که مطابقت می کند، پیدا شده است.
بنابراین ما مقدار دوم را با استفاده از foreach استخراج می کنیم.
استفاده از کلاس WebRequest / WebResponse
کلاس WebRequest، یک کلاس پایه انتزاعی می باشد. بنابراین ما از آن به صورت واقعی استفاده می کنیم. ما می توانیم از آن با استفاده از کلاس مشتق شده، بهره ببریم.
ما نیاز داریم که از کلاس WebRequest، برای ایجاد نمونه از آن، یک متد جدید ایجاد کنیم.
متد GetResponseStream، یک جریان داده را برمی گرداند. کدهای آن را در زیر مشاهده می کنید:
WebRequest request = WebRequest.Create (searchquery);// Create a request for the URL. request.Credentials = CredentialCache.DefaultCredentials;// If required by the server, // set the credentials. WebResponse response = request.GetResponse ();// Get the response. Stream dataStream = response.GetResponseStream (); // Get the stream containing content // returned by the server. StreamReader reader = new StreamReader (dataStream); // Open the stream using a StreamReader string responseFromServer = reader.ReadToEnd (); // Read the content.
سورس کد(Code Resourse) با responseFromServer string دانلود شده است. حالا می توانیم با استفاده از string در Regex.Match داده مورد نظر را که از قبل مشخص کردیم، استخراج کنیم.
- C#.net
- 3k بازدید
- 3 تشکر