فکر کنم از کلاس webclient خاصیت download string بود
باز دوستان در صورت غلط بودن میان تصحیح می کنن
چی؟؟؟؟؟میدونم اینم کدش ولی می خوامیه قیمتی از سورس اونم title ش رو می خ.ام
چی؟؟؟؟؟
با ASP.NET هم خیلی راحت میشه ( Page.Title ) اما شما تحت ویندوز می خواهید.قسمتی از title سایت رو می خوام.
چرا اوپیموم هم می شه کرد (با php به راحتی) اما با C# می خواستم بدونم می شه فقط درخواست ارسال title رو سرور کرد یا نه؟
واقعا که دمتتون گرم با این راهنمایی تون
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Fetched the title By Beginner
// Fetching Web site Titles By Moslem Salehi
string sFullHtml = Beginner.FetchHTML(textBox1.Text);//Type the URL In TextBox1
string sTitle = Beginner.FetchTitleFromHTML(sFullHtml);
textBox2.Text = sTitle;//See The Result in Textbox 2
}
}
public class Beginner
{
public static string FetchHTML(string sUrl)
{
System.Net.WebClient oClient = new System.Net.WebClient();
return oClient.DownloadString(sUrl);
}
public static string FetchTitleFromHTML(string sHtml)
{
string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
System.Text.RegularExpressions.Regex ex = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return ex.Match(sHtml).Value.Trim();
}
}
}
قسمتی از title سایت رو می خوام.
چرا اوپیموم هم می شه کرد (با php به راحتی) اما با C# می خواستم بدونم می شه فقط درخواست ارسال title رو سرور کرد یا نه؟
string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
خیر !!دوست عزیر به کدها دقت نکردی ! کلاس beginner در این کد فقط درخواست ارسال title رو به سرور ارسال می کنه
همونطور که در کد بالا میبنین درخواست به سرو ارسال می شه که هرچیزی بین تگ <title > وجود داره رو برای شما ارسال میکنه نه چیزه دیگه بعید میدونم از این سریعتر بشه !کد:string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
خیر !!
شما دارید یه استرینگ بزرگ رو Filter می کنید ! حالا می خواد RegularExpression باشه میخواد Compare . این دوستمون از اول متدی رو می خواست که فقط Title رو بگیره نه Title رو جداکنه .
کاملا حق با شماست من در مورد سوال دچار سوتفاهم شدم .ببخشید
حالا دوستانی که بیشتر واردن بیان یه روش دیگه ای بدن که سریعتر از اونی که من گفتم باشه !!
تنها راه شما اینه که title رو جدا کنی . آیا راه دیگه ای هم هست ؟ اگه آره بیشتر توضیح بدین
private void button2_Click(object sender, EventArgs e)
{
StreamReader sr = StreamReader.Null;
Stream myStream = Stream.Null;
string title = string.Empty;
try
{
WebClient myWebClient = new WebClient();
foreach (var item in listBox1.Items)
{
myStream = myWebClient.OpenRead(item.ToString());
sr = new StreamReader(myStream);
do
{
title = FetchTitleFromHTML(sr.ReadLine());
} while (title == string.Empty && sr.EndOfStream != true);
if (title != string.Empty)
listBox2.Items.Add(title); //Submit Title in ListBox
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
myStream.Close();
sr.Close();
sr.Dispose();
}
}
اگه مکانیزم کار رو مرور کنیم مشخصه که شما با یه صفحه HTML سر و کار داریم .
( صفحات PHP و ASP هم بعد از پردازش در سرور به html تبدیل میشن. )
بنابراین با Text سرو کار داریم .
تنها راهی که به نظر میرسه چیزی شبیه به StreamReader هست که خاصیت ReadLine و خاصیت Read ( از محدوده خاصی ) رو داره .
که با کلاس WebClient امتحان کردم و نتیجه قابل قبول بود ( از نظر سرعت اجرای برنامه ! )
کد:private void button2_Click(object sender, EventArgs e) { StreamReader sr = StreamReader.Null; Stream myStream = Stream.Null; string title = string.Empty; try { WebClient myWebClient = new WebClient(); foreach (var item in listBox1.Items) { myStream = myWebClient.OpenRead(item.ToString()); sr = new StreamReader(myStream); do { title = FetchTitleFromHTML(sr.ReadLine()); } while (title == string.Empty && sr.EndOfStream != true); if (title != string.Empty) listBox2.Items.Add(title); //Submit Title in ListBox } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { myStream.Close(); sr.Close(); sr.Dispose(); } }
»»@begiiner با اجازه از متد FetchTitleFromHtml شما استفاده کردم ( البته ورودیش فرق می کنه )
پی نوشت : به برنامه یه تایمر هم اضافه کردم تا زمان اجرای متد رو حساب کنه اما فکر کنم یه جایشو اشتباه کردم ( تو محاسبات زمان ! ) . پروژه رو پیوست کردم ، دوستان می تونن دانلود کنن ایراد کار رو بگن .
فکر می کنم زمان رو درست حساب نمیکنه ! 489ms باید 4.8s باشه
public static string FetchTitleFromHTML(string sHtml)
{
string regex = @"(?<=<title.*>)([\s\S]*)(?=</title>)";
System.Text.RegularExpressions.Regex ex = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return ex.Match(sHtml).Value.Trim();
}
try
{
WebRequest request = WebRequest.Create(url);
request.Timeout = timeout;
response = request.GetResponse();
Stream streamReceive = response.GetResponseStream();
Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
StreamReader streamRead = new System.IO.StreamReader(streamReceive, encoding);
while(streamRead.EndOfStream != true)
{
line = streamRead.ReadLine();
if (line.Contains("<title>"))
{
line = line.Split(new char[] { '<', '>' })[2];
break;
}
}
}
در مورد متدی که شما نوشتید و من استفاده کردم هم باید بگم که شما تو چندتا پست بالاتر کل html رو می خونید و پاس میدادید به متد. من یه خط می خونم .بازم زمان گرفتن title کمی زیاده چون بازم باید درخواست ارسال بشه و کل html رو ***** کنیم
اگه مکانیزم کار رو مرور کنیم مشخصه که شما با یه صفحه HTML سر و کار داریم .
( صفحات PHP و ASP هم بعد از پردازش در سرور به html تبدیل میشن. )
بنابراین با Text سرو کار داریم .
تنها راهی که به نظر میرسه چیزی شبیه به StreamReader هست که خاصیت ReadLine و خاصیت Read ( از محدوده خاصی ) رو داره .
که با کلاس WebClient امتحان کردم و نتیجه قابل قبول بود ( از نظر سرعت اجرای برنامه ! )
کد:private void button2_Click(object sender, EventArgs e) { StreamReader sr = StreamReader.Null; Stream myStream = Stream.Null; string title = string.Empty; try { WebClient myWebClient = new WebClient(); foreach (var item in listBox1.Items) { myStream = myWebClient.OpenRead(item.ToString()); sr = new StreamReader(myStream); do { title = FetchTitleFromHTML(sr.ReadLine()); } while (title == string.Empty && sr.EndOfStream != true); if (title != string.Empty) listBox2.Items.Add(title); //Submit Title in ListBox } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { myStream.Close(); sr.Close(); sr.Dispose(); } }
»»@begiiner با اجازه از متد FetchTitleFromHtml شما استفاده کردم ( البته ورودیش فرق می کنه )
پی نوشت : به برنامه یه تایمر هم اضافه کردم تا زمان اجرای متد رو حساب کنه اما فکر کنم یه جایشو اشتباه کردم ( تو محاسبات زمان ! ) . پروژه رو پیوست کردم ، دوستان می تونن دانلود کنن ایراد کار رو بگن .
فکر می کنم زمان رو درست حساب نمیکنه ! 489ms باید 4.8s باشه
من به شخصه تجربه کار با Thread ها را نداشته ام .
دوستان مجرب تر می تونن بهتر کمک کنن
Thread starter | عنوان | تالار | پاسخ ها | تاریخ |
---|---|---|---|---|
D | پرینت گرفتن از فرم | C#.NET | 1 | |
D | نحوه پرینت گرفتن از فرم بدون چاپ شدن دکمه ها | C#.NET | 6 | |
مشکل در پرینت گرفتن C# | C#.NET | 1 | ||
A | درخواست آموزش ساخت تولبار برای سایت | C#.NET | 1 | |
S | آموزش تصویری C# به زبان فارسی در سایت learningtv.ir | C#.NET | 2 |