PDA

View Full Version : سوال: جمع آوری لینک از سورس html



connector
پنج شنبه 27 آبان 1389, 00:46 صبح
با سلام
من میخوام تا لینکهای خاصی از سورس html روجمع آوری کنم و در یک لیست باکس نمایش بدم.برای مثال لینک هایی شبیه این در سورس که فقط عدد ،آخر لینک با هم تفاوت دارند :
http://www.siteName.com/view/Cat-212/1652.html
قبل از لینک هم تگ منحصر به فرد د سورس هست که کمک کنه.

خودم توسط IndexOf و حلقه تونستم که کاری کنم که جمع کنه.ولی به لینک 14 که میرسه ارور میده و برنامه بسته میشه.گاهی لینک 20 و گاهی هم تا آخر کارشو خوب انجام میده.

این متدی هست که من طراحی کردم ولی کارشو تا پایان ادامه نمیده



int IndexOfend;


public string Outputstring(string strSource, string strStart, string strEnd, decimal removeTag)
{

string strOut;
strOut = strSource.Substring(strSource.IndexOf(strStart, indexOfend) + Convert.ToInt32(removeTag),
strSource.IndexOf(strEnd, strSource.IndexOf(strStart))
- (strSource.IndexOf(strStart) + Convert.ToInt32(removeTag)));
indexOfend = strSource.IndexOf(strEnd, strSource.IndexOf(strStart, indexOfend+100));
strOut.Trim();
return strOut;

}




و ارور
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: startIndex
میده.آیا راه راحت تری هست که بتونم ازش استفاده کنم؟

bade saba
پنج شنبه 27 آبان 1389, 01:56 صبح
این ارور احتمالا به این خاطر هست که در بعضی مواقع عبارت زیر مقدار منفی تولید میکنه که نباید این گونه باشه



strSource.IndexOf(strStart, indexOfend) + Convert.ToInt32(removeTag)


اما گذشته از این ارور
به این خط که در زیر هست نگاه کنید


strOut = strSource.Substring(strSource.IndexOf(strStart, indexOfend) + Convert.ToInt32(removeTag),strSource.IndexOf(strEn d, strSource.IndexOf(strStart)) - (strSource.IndexOf(strStart) + Convert.ToInt32(removeTag)));


این یک خط از برنامه شماست ، برای اینکه آدم این خط رو بفهمه باید کلی وقت بزاره و در آخر هم هیچ اطمینانی نیست که درست فهمیده باشی. چه اجباریه که اینجوری مقدار به متد ها ارسال کنید ؟؟؟؟ این خط اونقدر طولانی شده که مجبور شدید به 3 تا خط بشکونیدش. چرا از متغییر استفاده نمیکنید؟؟؟؟ مقادیری که میخوایید به یه متد ارسال کنید رو جداگانه تولید کنید و در یک متغییر نگهداری کنید و اون متغییر رو به متد ارسال کنید این جوری برنامه شما خواناتر و ارور یابیش هم راحتر میشه.

پ. ن. : لطفا کدهاتون رو داخل تگ کد قرار بدید که قابل فهم تر باشه

موفق باشید

connector
پنج شنبه 27 آبان 1389, 02:31 صبح
شما راه راحت و جمع و جوری برای جمع کردن لینک ها میشناسید؟

Amir Oveisi
پنج شنبه 27 آبان 1389, 12:44 عصر
از کامپوننت HtmlAgility (http://htmlagilitypack.codeplex.com/) استفاده کنید. اگر اشتباه نکنم خودش یک متد داره که همه لینک های موجود در یک web page رو بهتون میده.
رایگان و opensource هم هست.

موفق باشید

mehdi.mousavi
پنج شنبه 27 آبان 1389, 13:23 عصر
شما راه راحت و جمع و جوری برای جمع کردن لینک ها میشناسید؟

سلام.
هر وقت خواستید توی یک رشته ای دنبال Pattern ای بگردید، اول از همه به Regular Expression ها فکر کنید (مگه اینکه بخواهید Embedded کد بنویسید، یا به هر دلیلی شرایط اجرایی به شما این اجازه رو نده). استفاده از RegEx ها شما رو از نوشتن خروارها کد Boilerplate نجات میده. پیدا کردن لینکهای موجود در یک داده ورودی نیز در چند خط توسط RegEx ها انجام پذیره:


string input = "the input html... <a href=\"http://google.com\">Google!</a>";

Regex regex = new Regex(@"<a[\s]+[^>]*?href[\s]?=[\s\\""\']+(?<href>.*?)[\\""\']+.*?>(?<content>[^<]+|.*?)?<\/a>", RegexOptions.Compiled);
foreach (Match match in regex.Matches(input))
{
string href = match.Groups["href"].Value;
//href == "http://google.com"

string content = match.Groups["content"].Value;
//content == "Google!"
}


همونطوریکه می بینید، توی چند خط بسادگی گفتم هر چی لینک توی input هستش رو پیدا کنه، href و content اش رو جدا کنه و ... اگر با نوشتن Pattern ها آشنایی ندارید، می تونید به کتاب آقای بهروز راد (http://barnamenevis.org/forum/showthread.php?t=120542) رجوع کنید.

موفق باشید.

bade saba
پنج شنبه 27 آبان 1389, 15:41 عصر
سلام.
هر وقت خواستید توی یک رشته ای دنبال Pattern ای بگردید، اول از همه به Regular Expression ها فکر کنید (مگه اینکه بخواهید Embedded کد بنویسید، یا به هر دلیلی شرایط اجرایی به شما این اجازه رو نده). استفاده از RegEx ها شما رو از نوشتن خروارها کد Boilerplate نجات میده. پیدا کردن لینکهای موجود در یک داده ورودی نیز در چند خط توسط RegEx ها انجام پذیره:


string input = "the input html... <a href=\"http://google.com\">Google!</a>";

Regex regex = new Regex(@"<a[\s]+[^>]*?href[\s]?=[\s\\""\']+(?<href>.*?)[\\""\']+.*?>(?<content>[^<]+|.*?)?<\/a>", RegexOptions.Compiled);
foreach (Match match in regex.Matches(input))
{
string href = match.Groups["href"].Value;
//href == "http://google.com"

string content = match.Groups["content"].Value;
//content == "Google!"
}


همونطوریکه می بینید، توی چند خط بسادگی گفتم هر چی لینک توی input هستش رو پیدا کنه، href و content اش رو جدا کنه و ... اگر با نوشتن Pattern ها آشنایی ندارید، می تونید به کتاب آقای بهروز راد (http://barnamenevis.org/forum/showthread.php?t=120542) رجوع کنید.

موفق باشید.


میشه راجب به RegEx بیشتر توضیح بدید؟؟؟ توضیح سینتکس که مثلا این خط داره چیکار میکنه رو نمیخوام اون رو یه کتاب میخونم میفهمم مسائلی قبل از شروع کتاب مثا اینکه این در چه زمینه هایی به درد میخوره و کلا هر چیزی که فکر میکنید قبل از یاد گیری بهتر هست بدونیم که شروع بکنیم به یادگیریش یا نه

ممنون