أمضيتُ ما يقارب الخمس ساعات و أنا أبحث عن كيفية قراءة عنوان صفحة ما (title) من قسم الـ head في الـ html بدون فتح الـ السورس كود. و هذه تفيد في عدة نواح مثلاً: بناء محرك بحث أو كما في المثال التالي... و ذلك من خلال لغة الـ ASP
البعض قد يستخدم الـ document.title من خلال الجافاسكريبت و لكنها ليست فعالة لغرضنا هنا
على كل حال، هذا المثال هو أفضل ماوجدت و على الرغم من أنه قد يأخذ وقتاً طويلاً في التنفيذ فيجعل فائدته قليلة نوعاً لكنني أحببت مشاركة الفكرة
و المثال هو هنا:
http://www.asp101.com/wrox/17970704.asp
هو كالتالي:
- يوجد قاعدة بيانات فيها مواقع الكترونية URLs
- يقرأ هذه الـ urls ثم يقوم بقراءة محتواها
- يقرأ في كل صفحة مابين الـ tiltle meta tags
<title> ... </title>
و إذا لم يجد الـ title يظهر أن الصفحة غير معرفة undefined
- يعرض المواقع الموجودة و تحت كل موقع عنوانه (title)
- يبحث في محتوى الموقع إذا كان يحوي كلمات معينة (سيئة مثلاً) يقوم بالتنبيه لها
- يعرض مجموع المواقع التي تحوي تنبيه
كود الااتصال مع قاعدة البيانات و تحديد وقت استنفاد التنفيذ <%@ LANGUAGE=VBSCRIPT %> <!-- #include virtual="/connect/linksdb.inc" --> <% Server.ScriptTimeOut = 2400 %> <% seekTitleTimeout = 45 %> ... ...
ثم يتم فتح الاتصال مع قاعدة البيانات و استخراج المواقع و طباعتها من خلال Do while
(في المثال تم افتراض المتغير strURL لكل موقع)
المشكلة الحقيقة هي الآن، استخراج محتويات كل موقع (صفحة) أو ما يسمى:
Fetching the Page with the ASP.HTTP Component
(مع ملاحظة أن ليس جميع شركات الاستضافة تدعم الـ ASP.HTTP)
...
strResult = "" هنا سنضع محتوى الصفحة
strTitle = "" هنا عنوان الصفحة
Set oHTTP = Server.CreateObject("ASP.HTTP")
oHTTP.Url = strURL
oHTTP.TimeOut = seekTitleTimeout وقت الاستنفاد
strResult = oHTTP.GetURL
Set oHTTP = Nothing
If Len(strResult) = 0 Then
Response.Write "<B>>> لا يوجد رد من الموقع في " _
& seekTitleTimeout & "seconds.</B><P>" & CRLF
intNumPages = intNumPages + 1 لزيادة المجموع الخاص بالمواقع السيئة
Else
اذا كان محتوى الصفحة يحوى التالي فهناك خطأ ما بعد الأخذ باعتبارات الأحرف الصغيرة في الانكليزية
If Instr(LCase(strResult), "error") > 0 _
Or Instr(LCase(strResult), "invalid") > 0 Then
Response.Write "<B>>> Request returned an error.</B><P>" & CRLF
intNumPages = intNumPages + 1 لزيادة المجموع الخاص بالمواقع السيئة
Else سنقوم الآن باستخراج العنوان
...
...... 'استخراج المحتويات بين نصي '<title></title> 'بعد الأخذ اعتبارات السمول لترز في الأحرف الانكليزية intStart = Instr(UCase(strResult), "<TITLE>") + 7 intFinish = Instr(UCase(strResult), "</TITLE>") 'في حال لم تضع هذه سيشر إلى خطأ في MID If (intStart > 0) And (intFinish > intStart) Then strTitle = Trim(Mid(strResult, intStart, intFinish - intStart)) End If إذا لم يجد عنوان If Len(strTitle) = 0 Then strTitle = "Untitled page at:" البحث عن كلمات غير مرغوب فيها في المحتوى strResult = LCase(strResult) If InStr(strResult, " sex ") Or InStr(strResult, " adult ") Or _ InStr(strResult, " porn ") Or InStr(strResult, " xxx ") Or _ InStr(strResult, " nude ") Or InStr(strResult, " sexy ") Then intNumPages = intNumPages + 1 لزيادة المجموع الخاص بالمواقع السيئة Response.Write "<B>>> Content Warning!</B> " End If كتابة عنوان الصفحة Response.Write "Page title is: " & strTitle & "<P>" & CRLF strResult = "" End If End If ...
و هذه الطريقة قد تكون مفيدة في حالات اخرى مثلاً:
استخراج الموجود بين نصي: <H1> ... </H1>
وهكذا...
أحببتُ المشاركة في شئ قد أتعبني و أخذ من وقتي الكثير حتى وجدته :)