PDA

View Full Version : Html Parser



SoheilKH
پنج شنبه 27 فروردین 1383, 16:30 عصر
با سلام

کاری که من می خواهم انجام دهم اینکه یک فایل از نوع Html را بگیرم سپس تمام تگ های اون فایل را بخونم . چند تا مثال و کلاس در همین مورد پیدا کردم اما اون چیزی که می خواستم نبود! .اون ها line را می خوندند. اما من تگ را می خواهم بخونم .

اون چیزی که به ذهن من رسیده این که از اول فایل شروع به خوندن کنم هر جا به کراکتر > بر خوردم شروع به خوندن تگ کنم و هر جاهم که به < بر خوردم خوندن تگ را تمام کنم. البته این مستلزم در نظر گرفتن کلی پارامتر ها و نکته های دیگه است.که خودتون بهتر می دونید

اول می خواهم توی وب بگردم ببینم چیز به درد بخوری پیدا میکنم یا نه !

کسی مقاله در این مورد سراغ داره .
از ایده های شما با کمال میل استقبال می کنم.

با تشکر

Spoofed
پنج شنبه 27 فروردین 1383, 17:56 عصر
بهترین راه برای انجام اینگونه امور استفاده از فضای نام System.Text.RegularExpressions است ( توابع آن در php هم موجود است ).


ماخذ سورس زیر سایت کد پراجکت است (نام فایل HTMLParser.cs):


using System;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Schema;

namespace site_searcher
{
/// <summary>
/// Summary description for HTMLParser.
/// </summary>

public class HTMLParser
{
public const string RE_HTMLTag = @"\<.*?>";
public const string RE_QuoteAttributes = @"\<(?<tagName>[a-zA-Z]*) (?<attributeName>[a-zA-Z]*)( )*=( )*(?<attributeValue>[#a-zA-Z0-9]*)?>";

protected static Regex HTMLTagRE;
protected static Regex QuoteAttributesRE;

static HTMLParser()
{
HTMLTagRE = new Regex(RE_HTMLTag, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
QuoteAttributesRE = new Regex(RE_QuoteAttributes, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
}

public HTMLParser()
{

}

public static string QuoteAttributes(string input)
{
int tagIndex = QuoteAttributesRE.GroupNumberFromName("tagName");
int nameIndex = QuoteAttributesRE.GroupNumberFromName("attributeName");
int valueIndex = QuoteAttributesRE.GroupNumberFromName("attributeValue");

int startAt = 0;

string val = input;

while( QuoteAttributesRE.IsMatch(val, startAt) )
{
Match m = QuoteAttributesRE.Match(val, startAt);

string tagName = m.Groups[tagIndex].Value;
string attributeName = m.Groups[nameIndex].Value;
string attributeValue = m.Groups[valueIndex].Value;

if( m.Groups[valueIndex].Length > 0 )
{
System.Diagnostics.Trace.WriteLine(attributeName + " " + attributeValue);

val = QuoteAttributesRE.Replace(val, "<" + tagName + " " + attributeName + "='" + attributeValue + "'>", 1, startAt);
}

startAt = m.Index + m.Length + 3;
}

return val;
}


public static string RemoveHTMLTags(string input)
{
return HTMLTagRE.Replace(input, "");
}
}

}