PDA

View Full Version : سوال: بدست آوردن مقادیر بین تگ <a>



jeson_park
جمعه 04 بهمن 1392, 18:08 عصر
با سلام
به وسیله کلاس HttpWebRequest و HttpWebResponse سورس صفحه وبی رو توی یه رشته ذخیره می کنم
حالا می خوام از توی این سورس یه لینک که در تک <a> قرار داره رو در بیارم


<a href='http://dl.mysite.com/Files/Software/PhotoShop_V10_jan_2014.rar'>
چه طوری باید این مقدار
http://dl.mysite.com/Files/Software/PhotoShop_V10_20_11_2014.rar رو بدست از این رشته بدست بیارم؟؟
یه مشکلی هم که هست اینه که آدرس به صورت ماهانه تغییر می کنه مثلاً ماه بعد می شه

http://dl.mysite.com/Files/Software/PhotoShop_V11_feb_2014.rar

ممنون می شم اگه راهنمایی کنید

Share & Learn
جمعه 04 بهمن 1392, 18:46 عصر
سلام
بفرما:


string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
MessageBox.Show(link[1]);
}
}

jeson_park
جمعه 04 بهمن 1392, 19:40 عصر
با تشکر از دوستان
آقای Share & Learn این کدی که شما دادی همه جور لینکی رو برگردوند جز اون لینکی که می خواستم
ببنید من توی اون صفحه می دنبال لینک
http://dl.mysite.com/Files/Software/PhotoShop_V11_feb_2014.rar بگردم
من فقط می خوام لینک تگ <a> رو که توش آدرس فایلی با پسوند مشخصی (مثلاً exe یا rar ) هست رو بدست بیارم
این همه لینک ها رو بر می گردونه

Share & Learn
جمعه 04 بهمن 1392, 20:21 عصر
با تشکر از دوستان
آقای Share & Learn این کدی که شما دادی همه جور لینکی رو برگردوند جز اون لینکی که می خواستم
ببنید من توی اون صفحه می دنبال لینک
http://dl.mysite.com/Files/Software/PhotoShop_V11_feb_2014.rar بگردم
من فقط می خوام لینک تگ <a> رو که توش آدرس فایلی با پسوند مشخصی (مثلاً exe یا rar ) هست رو بدست بیارم
این همه لینک ها رو بر می گردونه

اون کد همه ی لینک های موجود داخلِ تگ <a> در سورس صفحه رو می داد
این باید اونایی که پسوند rar یا exe دارند رو بده
اگه نمی ده یه لینک به من بدید که تو سورسش چیزی که شما می خواین رو داشته باشه تا بتونم تست کنم و کد رو اصلاح کنم



string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
string[] pasvand = link[1].Split('.');

if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe"))
{
MessageBox.Show(link[1]);
}
}
}

jeson_park
جمعه 04 بهمن 1392, 20:46 عصر
باز هم امتحان کردم و همه لینک ها رو چک کرد بجز فایل
ببنید مثلاً این صفحه


http://www.asandownload.com/software/entry/4990/

یه لینک تو سورس صفحه هست به نام


http://s1.asandownload.com/software/utilities/disk-tools/MBR.Regenerator.v4.5_www.AsanDownload.com.zip

خب این لینک رو من م خوام در بیارم

Share & Learn
جمعه 04 بهمن 1392, 21:01 عصر
اون کد همه ی لینک های موجود داخلِ تگ <a> در سورس صفحه رو می داد
این باید اونایی که پسوند rar یا exe دارند رو بده
اگه نمی ده یه لینک به من بدید که تو سورسش چیزی که شما می خواین رو داشته باشه تا بتونم تست کنم و کد رو اصلاح کنم



string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
string[] pasvand = link[1].Split('.');

if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe"))
{
MessageBox.Show(link[1]);
}
}
}





باز هم امتحان کردم و همه لینک ها رو چک کرد بجز فایل
ببنید مثلاً این صفحه


http://www.asandownload.com/software/entry/4990/

یه لینک تو سورس صفحه هست به نام


http://s1.asandownload.com/software/utilities/disk-tools/MBR.Regenerator.v4.5_www.AsanDownload.com.zip

خب این لینک رو من م خوام در بیارم


شما باید پسوندهایی که می خواین خودتون به کد اضافه کنید
تو کد من لینکهایی که با پسوند rar یا exe هستند رو می ده
برای اینکه اونایی که پسوند zip دارند رو هم بده باید این قسمت رو به این شکل تغییر بدید:



if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
{
MessageBox.Show(link[1]);
}

jeson_park
جمعه 04 بهمن 1392, 21:48 عصر
کد شما اصلا کار نکرد!

Share & Learn
جمعه 04 بهمن 1392, 22:01 عصر
تغییرات رو درست اعمال کردید؟
بعد از تغییری که گفتم کد به این صورت در میاد :


string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
string[] pasvand = link[1].Split('.');

if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
{
MessageBox.Show(link[1]);
}
}
}

jeson_park
شنبه 05 بهمن 1392, 13:14 عصر
این عبارت با قاعده شما که لینک ها رو پیدا می کنه اما نه لینکی که به فایل پسوند دار باشه
برای پیدا کردن URL در تگ <a>

<a\s+(?:[^>]*?\s+)?href="([^"]*)"

اما من آدرسی رو می خوام که پسوند فایل داخلش باشه

samin_panahi
شنبه 05 بهمن 1392, 13:23 عصر
این عبارت با قاعده شما که لینک ها رو پیدا می کنه اما نه لینکی که به فایل پسوند دار باشه

اونجوری که از کد معلومه میاد لینکهایی که پسوند rar و exe و zip دارند رو نشون می ده
لینکی که شما می خواین چه پسوندی داره که این نشون نمی ده ؟

jeson_park
شنبه 05 بهمن 1392, 13:51 عصر
اونجوری که از کد معلومه میاد لینکهایی که پسوند rar و exe و zip دارند رو نشون می ده
لینکی که شما می خواین چه پسوندی داره که این نشون نمی ده ؟
اینم رو در پست شماره 5 (http://barnamenevis.org/showthread.php?438161-%D8%A8%D8%AF%D8%B3%D8%AA-%D8%A2%D9%88%D8%B1%D8%AF%D9%86-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-%D8%A8%DB%8C%D9%86-%D8%AA%DA%AF-lt-a-gt&p=1961187&viewfull=1#post1961187)گذاشتم
کدی هم که آقای share & learn گذاشتن دقیقاً همه لیتک ها یی رو که پسوند نداره بر می گردونه!

samin_panahi
شنبه 05 بهمن 1392, 13:56 عصر
پسوند داخل pattern باشه؟
خوب شما چه پسوند هایی رو می خواین؟
هر فایل html تعداد زیادی لینک داره که اکثرا آخرش یه پسوندی داره مثل .asp ، .html ، .aspx ، .pdf ، .zip ، .rar و ....
شما باید پسوند هایی که می خواین مشخص باشه وگرنه باز همه ی لینک هایی که پسوند داره رو می ده
این روشی که Share & Learn (http://barnamenevis.org/member.php?317640-Share-amp-Learn) گفتند به نظرم روش خوبیه
اومدن لینک ها رو در آوردن، بعد پسوندش رو پیدا کردند، اونایی که پسوندشون با چیزی که می خوایم یکیه رو تو یه پیغام نشون دادند!

jeson_park
شنبه 05 بهمن 1392, 14:17 عصر
دوستان مشکل از regex بود تقریباً حل شد
این عبارتی که share & learn دادن لینکهای با پیشوند www رو برام پیدا می کرد چی جوری نمی دونم! :لبخند:
اما الان این regex که خودم پیدا کردم ج.اب می ده


@"((http://s1.asandownload.com){1}\S+)";

فقط موقعی که می خواد وارد قسما شرط بشه


if (matches.Count > i) {
string[] link = matcheCollection[i].Value.Split('"');
string[] pasvand = link[1].Split('.');

if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
{
MessageBox.Show(link[1]);
}
}


در قسمت if (matches.Count > i) دچار اکسپشن می شه
چون کد شما مقدار Count 14 تا بود و در کد من 1 هست

samin_panahi
شنبه 05 بهمن 1392, 14:36 عصر
دوستان مشکل از regex بود تقریباً حل شدخوب خدا رو شکر که حل شد


این عبارتی که share & learn دادن لینکهای با پیشوند www رو برام پیدا می کرد چی جوری نمی دونم!امکان نداره، این همه ی لینک ها رو می ده، احتمالا چون تعداد لینک ها زیاده و اکثرا با www شروع می شن شما متوجه اونایی که www ندارن نشدید
اگه
1: اون قسمت http://s1.asandownload.com تو همه ی لینک ها ثابته و احتمال اینکه s1 بشه s2 وجود نداره
2: تو هر صفحه همه ی اون لینک هایی که با http://s1.asandownload.com شروع می شن رو می خوای
فکر کنم اونی که Share & Learn (http://barnamenevis.org/member.php?317640-Share-amp-Learn) گفته رو اینجوری تغییر بدی درسته



//string pattern = @"(<a href=""http://[^>]+\>)";
string pattern = @"(<a href=""http://s1.asandownload.com[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
//string[] pasvand = link[1].Split('.');

//if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
//{
// MessageBox.Show(link[1]);
//}
MessageBox.Show(link[1]);
}
}

jeson_park
شنبه 05 بهمن 1392, 15:18 عصر
من عبارات با قاعده بلد نسیستم
حالا اگه متغیر باشه آدرس چی؟
مثلاً هر آدرسی که توش .asandowload.com بهش مثل dl.asandowload.com ,و dl2.asandowload.com و با پسوند خاصی مثل .exe و یا .jpg و یا یه پسوندی تموم بشه
کد شما هم اجر نشد برنامه از روی شرط if (matches.Count > i) می پره و شرط رو اجرا نمی کنه

jeson_park
شنبه 05 بهمن 1392, 15:34 عصر
مشکل از برنامه نیست
ارور نداره که
مقدار Count صفر هست حلقه اجرا نمی شه پس یعنی عبارت با قاعدع اشتباه هست که چیزی رو پیدا نکرده
115902

samin_panahi
شنبه 05 بهمن 1392, 16:08 عصر
مشکل از برنامه نیست
ارور نداره که
مقدار Count صفر هست حلقه اجرا نمی شه پس یعنی عبارت با قاعدع اشتباه هست که چیزی رو پیدا نکرده
115902
می شه یه عکس از string pattern تا آخر حلقه بذارید
الان تو این عکس شما split رو بر حسب \ انجام دادید
اینجوری بنویسید :

string[] link = matcheCollection[i].Value.Split('"');

link هم باید شماره ی یکش تو مسیج باکس نشون داده بشه

MessageBox.Show(link[1]);

اینا رو اصلاح کنید اگه بازم مشکلی بود بگید

jeson_park
یک شنبه 06 بهمن 1392, 00:24 صبح
اینا مشکلی نداره
بر حست \ نداشتم یکم دقت کنید میبینید بر حسب ' گداشتم که باید اینطوری نوشتش \' :لبخندساده:
اما چرا بر حسب کارکاکتر ' گداشتم این هست که اگر کاراکتر " رو به عنوان جدا کننده بدم لینکی که به من می ده اینطوری هست

http://s1.asandownload.com/software/utilities/disk-tools/MBR.Regenerator.v4.5_www.AsanDownload.com.zip'>
همینطور که می بینید کارکتر های '> هم اضافه هستند که باید حدف بشن

Share & Learn
یک شنبه 06 بهمن 1392, 01:06 صبح
مشکل دقیقا همینه دوست من
اول اینکه هیچ لینکی \ نداره اگر هم می خوای اونجوری بنویسی باید بر حسب / بنویسی نه \ که می شه :
string[] link = matcheCollection[i].Value.Split('/');
که اون موقع اگه بنویسی MessageBox.Show(link[0]);
خروجی می شه http:
اگه بنویسی MessageBox.Show(link[2]);
خروجی می شه s1.asandownload.com در کل چیز بدرد بخوری نمی ده

اونجا هم که گفتی وارد for نمی شه چون count صفره، وارد می شه و از صفر می ره تا matches.count

یه تکست باکس مولتی لاین بذار و خاصیت scrollBars رو هم رو both بذار که خروجی هارو ببینی

string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
//string[] pasvand = link[1].Split('.');

//if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
//{
// //MessageBox.Show(link[1]);
// textBox1.Text += link[1] + "\n";
//}
//MessageBox.Show(link[1]);
textBox1.Text += link[1] + "\n";

}
}

این کد وقتی اجرا می شه خروجیش می شه :

115929

و این کد :

string pattern = @"(<a href=""http://[^>]+\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
string[] pasvand = link[1].Split('.');

if (pasvand[pasvand.Length - 1] == ("rar") || pasvand[pasvand.Length - 1] == ("exe") || pasvand[pasvand.Length - 1] == ("zip"))
{
//MessageBox.Show(link[1]);
textBox1.Text += link[1] + "\n";
}
//MessageBox.Show(link[1]);
//textBox1.Text += link[1] + "\n";

}
}
خروجیش می شه :


115928

اگه دوست داشتی می تونی اون قسمت شرط if (matches.Count > i)
رو هم کامنت بگیری که پیشنهاد می کنم نکنی این کار رو

jeson_park
یک شنبه 06 بهمن 1392, 07:36 صبح
ممنون
برنامه خودم مشکلی الان نداره خروجی رو هم درست می ده. این MessageBox.Show(link[2]); رو هم بدم خالیه.چرا؟؟؟؟ خب چون من توی عبارت با قاعده مشخص کردم که فقط لینکی رو می خوام که با dl.asandowload.com شروع شده باشه و رشته ای هم که دست من می ده فقط حاوی 1 دونه لینکه که همون لینک دانلوده پس مقدار link[2] وجود نداره .اما کد شما همه لینک ها رو می گیره و به همین دلیل باید کد رو به صورت link[2] بدم تا لینک فایل رو بهم بده
اما مشکل من الان همین عبارت با قاعدست که نه توی کد شما حل شده و نه توی کد من
مشکل عبارت من اینه که انعطاف پذیری نداره و توی خود عبارت مشخص شده که دنبال لینک توی چه آدرسی بگرده
مال شما هم همه آدرس ها ی توی یک صفحه رو بر می گردونه
اگه عبارت با قاعده ای بنویسم که "کلیه لینک های که در آخرشون پسوند سه حرفی باشه " اونوفت فکر می کنم بهتر باشه

behi1ty
یک شنبه 06 بهمن 1392, 09:00 صبح
سلام
آقاي Share & Learn اگر يه كمكي هم به ما كني كلي دعات مي كنم
من مي خوام عنوان يه سايت و بخونم
مي دونم با دستور زير مي شه اينكار رو كرد

System‎.Net.WebClient client = new System‎.Net.WebClient();
string content = client.DownloadString("http://www.google.com");
string title = content.Substring(content.IndexOf("<title>"), content.IndexOf("</title>") - content.IndexOf("<title>")).Replace("<title>", "").Trim();



اين دستور مثلا براي سايت گوگل درست جواب مي ده اما مثلا سايته http://www.tsetmc.com/Loader.aspx?ParTree=151311&i=7745894403636165
جواب نمي ده
ممنون

jeson_park
یک شنبه 06 بهمن 1392, 13:04 عصر
من مي خوام عنوان يه سايت و بخونم

دوست عزیز باید تاپیک جدا گونه میزدین
با Regex به این صورت می شه

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;

samin_panahi
یک شنبه 06 بهمن 1392, 13:53 عصر
دوست عزیز باید تاپیک جدا گونه میزدین
با Regex به این صورت می شه

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;

شما مشکلتون حل شد؟

jeson_park
یک شنبه 06 بهمن 1392, 18:45 عصر
شما مشکلتون حل شد؟
مشکل من حل شده ولی فقط همون عبارت با قاعده مونده...الان می تونم استفاده کنم از برنامه اما خب باید آدرس سایت رو توی عبارت با قاعده تغییر بدم

Share & Learn
یک شنبه 06 بهمن 1392, 21:51 عصر
این MessageBox.Show(link[2]); رو هم بدم خالیه.چرا؟؟؟؟ این مربوط به متد split هست، در موردش مطالعه کنید متوجه می شید
چون split بر حسب / انجام شده و حاصل به ترتیب می شه : http ، خالی ، s1.asandownload.com و software و utilities و .... تا آخر لینک
از اونجا که split بر حسب / انجام شده و لینک http://s1.asandownload.com/software/utilities/disk-tools/MBR.Regenerator.v4.5_www.AsanDownload.com.zip هست
حاصل به ترتیب می شه : http:]/[]/[s1.asandownload.com]/[software]/[utilities]/[disk-tools]/[MBR.Regenerator.v4.5_www.AsanDownload.com.zip]l]
اگه توضیح مفهوم نبود بگید واضح تر بگم


اگه عبارت با قاعده ای بنویسم که "کلیه لینک های که در آخرشون پسوند سه حرفی باشه " اونوفت فکر می کنم بهتر باشهبفرما:
string pattern = @"(<a href=""http://[^>]+[.][a-z]{3}""\>)";

اینم تکه کد:

string pattern = @"(<a href=""http://[^>]+[.][a-z]{3}""\>)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(HTML_E_SITE.Text);
MatchCollection matcheCollection;
matcheCollection = rgx.Matches(HTML_E_SITE.Text);

for (int i = 0; i < matches.Count; i++)
{
if (matches.Count > i)
{
string[] link = matcheCollection[i].Value.Split('"');
textBox1.Text += link[1] + "\n";

}
}

jeson_park
دوشنبه 07 بهمن 1392, 12:22 عصر
این regex اشتباهه مقدار Count برابر 0 هست و اصلاً for اجرا نمی شه
من اون چیزی رو که می خواستم بدست آوردم ولی ثابت هست
به هر حال ممنون

samin_panahi
دوشنبه 07 بهمن 1392, 13:02 عصر
تو این سایت می تونید Regex رو تست کنید http://regexpal.com
html صفحه رو اون پایین کپی کنید Regex هم اینجوری بذارید (<a href="http://[^>]+[.][a-z]{3}"\>)

همین رو تو سی شارپ اینجوری می نویسن (<a href=""http://[^>]+[.][a-z]{3}""\>)
چیزی که highlight می شه اینه :
<a href="http://s1.asandownload.com/software/utilities/disk-tools/MBR.Regenerator.v4.5_www.AsanDownload.com.zip">

http://barnamenevis.org/attachment.php?attachmentid=116000&d=1390817020

behi1ty
دوشنبه 07 بهمن 1392, 22:57 عصر
دوست عزیز باید تاپیک جدا گونه میزدین
با Regex به این صورت می شه

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;


سلام
ممنون که جواب دادین
دیدم نوع سوال یکی هست برای همین تو همین جا پرسیدم
آقا این کدی که شما زحمت کشیدین دادین که اطلا عنوان هیج سایتی را بر نمی گردونه

jeson_park
سه شنبه 08 بهمن 1392, 14:09 عصر
سلام
ممنون که جواب دادین
دیدم نوع سوال یکی هست برای همین تو همین جا پرسیدم
آقا این کدی که شما زحمت کشیدین دادین که اطلا عنوان هیج سایتی را بر نمی گردونه
در کد پارامتر اول تابع Match به نام source هست
شیوه ای مه من متغییر source زو مقدار می دم شاید با شما فرق کنه

string source = null;

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("www.google.com");
HttpWebResponse myres = (HttpWebResponse)myReq.GetResponse();

using (StreamReader sr = new StreamReader(myres.GetResponseStream()))
{
source = sr.ReadToEnd();

}

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;