الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف استخرج اللنكات من ملف نصي

بدأه النمر المقنع في 7 أبريل 2008 · 9 رد · 907 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أنا أتابع المنتدى من فترة وحبيت التفاعل اللي فيه والتعاون...

وعندي سؤال أرجو التفاعل معي فيه ومساعدتي...

السؤال:

عندي ملف عبارة عن كود (HTML)لصفحة ما

وأريد أن استخرج جميع الوسوم الخاصة بالارتباطات مثل:

<a href="">'>">

أريد أن أحصل فقط على عنوان الموقع بدون الأمور السابقة له

...

بمعنى أن المطلوب فقط أن يعطيني البرنامج ===>

والتي هي تقع بين الدبل كوتس""

ومن باب إظهار الجدية في الأمر فقد حاولت كثيرا باستخدام الطرق التالية:

findilLine()

useDelimiter()

ولكن للأسف ما ضبطت!!

فأنتظر المساعدة وجزاكم الله خيرا

#2

عليكم السلام

/index.ph...53383&st=10

المشاركة #17

الله معك

#3
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;

public class Test1 {

	static Vector<String> links = new Vector<String>();

	public static void main(String[] args) {
		String filePath = " ... put the file path here ... ";
		try {
			FileReader fr = new FileReader(filePath);
			BufferedReader br = new BufferedReader(fr);

			String line = new String();
			// read the file line by line
			while ((line = br.readLine()) != null) {
				// for each line, get links from it and add them to the vector : links
				getLink(line);			
			}

			// print final links
			for (int i = 0; i < links.size(); i++) {
				String link = links.get(i);				
				System.out.println(link);
			}

		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

	public static void getLink(String segment){
		// get the first index of "<a " in the segement
		int startIdx1 = segment.indexOf("<a ");			 
		if(startIdx1>=0){ // the current segment contains the <a> tag 
			// get the substring from the index to the end of the segement 
			String sub1 = segment.substring(startIdx1);
			// get the first index of ">"
			int endIdx1 = sub1.indexOf(">");
			// the initial link is the substring of sub1 from its begining to endIdx1
			String link = sub1.substring(0,endIdx1);
			// refine the initial link
			String newLink = refine(link);
			if(newLink!=null){
				// add the refined link to the vector links
				links.addElement(newLink);
			}			
			// re-treate the reminder of the segement
			String reminder = sub1.substring(endIdx1);
			getLink(reminder);			
		}	
	}

	public static String refine(String link){
		int idx = link.indexOf("href");		
		if(idx>=0){ // this link contains "href"
			// remove href from the begining
			String p1 = link.substring(idx+4);
			// remove spaces from begining (if any)
			p1 = p1.trim();
			// remove = from the begining 
			p1 = p1.replaceFirst("=","");
			// remove spaces from begining (if any)
			p1 = p1.trim();
			// now the first char is " or ' 
			String q = p1.substring(0,1);
			if(q.equals("\"")){
				// the next index of " 
				int end = p1.indexOf("\"",1);
				p1 = p1.substring(1,end);
			} else if(q.equals("'")){
				// the next index of '
				int end = p1.indexOf("'",1);
				p1 = p1.substring(1,end);
			}
			return p1;
		}	
	 	// if the link does not contain "href" then return null
		return null;
	}

}

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 7 أبريل 2008 في 22:05

أبو خالد السوري

#4

أشكرك عزيزي shado على الرد

ولكني لم أجد المطلوب!!

والمطلوب هو:

برنامج يقرأ الملف المحتوي على (html) ثم يعطيني جميع الوصلات الموجودة فيه

والظاهر -والله أعلم- أن ال(method)===>useDelimiter مفيدة في هذا الشأن؛ولكني لم أعرف طريقتها!!

---

أما الأخ أبو خالد فأشكرك والله لا يحرمك الأجر

وأنا الآن سأجرب الكود والله يعطيك العافية

تم تعديل هذه المشاركة بواسطة النمر المقنع في 7 أبريل 2008 في 22:15

#5

قصدك jsp ولا html

mofeedchaar@hotmail.com

#6
mofeed chaar كتب:
قصدك jsp ولا html

أعتذر عن تأخر الرد أولا

وأنا أقصد HTML

ويبدو لي أن الأفضل استخدام ال(matching)

ولكني لم أعرف لها،فأرجو المساعدة

#7

اعتقد ان الاخ ابو خالد كفى ووفى

هذه الخطوات ببساطه :

اقرآ الملف سطر بسطر

اذا وجدت " وبعده http

خذ كل مابين (") الاول و( ") الثاني

انظر الى الكلاس String

الدوال index , substring

#8

هناك طريقه أفضل وخاصه أننا هنا نريد عمل HTML Parser ، سأرفق لك مثال كتبته على عجل ، وسأعود غدا إن شاء الله للحديث عنه -سأتكلم عنه في موضوع برمجه الشبكات- ، حيث موضوع HTML Parser من المواضيع المهمه وهي ضروريه في بعض التطبيقات .

// HTMLDemo3.java
// Extract Link From URL
// By : Romansy

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;

import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.Writer;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;

import java.net.URL;
import java.util.Enumeration;

class ParserGetter extends HTMLEditorKit
{
	public HTMLEditorKit.Parser getParser ()
	{
		return super.getParser();
	}
}

class TagTake extends HTMLEditorKit.ParserCallback
{
	private Writer out;
	private boolean isLink = false;

	public TagTake (Writer o )
	{
		out = o;
	}

	/*
	public void handleText (char text[] , int position)
	{
		try
		{
			if ( isLink )
			{
				out.write(text);
				out.flush();
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	*/


	public void handleStartTag ( HTML.Tag tag , MutableAttributeSet attributes , int position )
	{
		if ( tag == HTML.Tag.A )
		{
			isLink = true;

			Enumeration e = attributes.getAttributeNames( );

			while (e.hasMoreElements( )) 
			{
				Object name = e.nextElement( );
				Object value = attributes.getAttribute(name);

				System.out.println( value);


			}
		}
		else
		{
			isLink = false;
			return;
		}

	}

	public void handleEndTag (HTML.Tag tag , MutableAttributeSet att , int position)
	{	
		if ( tag == HTML.Tag.A )
			isLink = false;
	}
}

public class HTMLDemo3
{
	public static void main (String args[])
	{
		ParserGetter kit = new ParserGetter ();
		HTMLEditorKit.Parser parser = kit.getParser();
		HTMLEditorKit.ParserCallback callback = new TagTake( new OutputStreamWriter(System.out) );

		try
		{
			URL u = new URL("http://localHost");
			InputStream in = new BufferedInputStream(u.openStream());
			InputStreamReader r = new InputStreamReader(in);

			parser.parse(r,callback,true);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}

أختبرت البرنامج في localhost وأعطاني جميع اللنكات - قام بطباعتها في الشاشه- بالطبع يمكنك تغيير الStream ومثلا انزال اللنكات في ملف ، أو أي مكان أخر .

بالتوفيق .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

أظن الشباب قد قاموا بالواجب وزيادة

خذ عندك الطريقة التالية

في البداية ابحث عن المقطع ">"

ثم خذ جملة جزئية إلى المقعطع "<"

خزن ما بين المقطعين السابقين في سلسلة LinkedList

كرر على باقي النص

الآن أنت تملك سلسلة تحتوي جميع الأوسمة tags

الآن ابحث في كل وسام عن أول حرف ليس مسافة

بعدها قم بفحص أول كلمة إن كانت a فهو الوسم المطلوب

وإلا ننتقل إلى الوسم التالي

إن كان الوسم هو المطلوب نقوم بالبحث عن href ثم نبحث نأخذ ما بين علامتي الاقتباس " "

بعد ذلك نقوم بعمل تجاهل للمسافات في العنوان

طريقة طويلة بعض الشيء لكنها تقوم بالمطلوب

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

Xline

romansy

alaadiaa

شكرا لكم وجزاكم الله خيرا

الآن حصلت على حلول متنوعة للمشكلة

وإن شاء الله نستفيد منها أحسن فائدة،،،شكرا لكم جميعا

مواضيع مشابهة