এইচটিএমএল ফাইল থেকে ওয়েবসাইটের ইউআরএলগুলি পেতে গ্রিপ এবং স্ক্রিপ্টে কাটা কীভাবে ব্যবহার করবেন


21

আমি এইচটিএমএল ফাইল থেকে ইউআরএল বের করতে গ্রেপ এবং কাট ব্যবহার করার চেষ্টা করছি। লিঙ্কগুলি দেখতে দেখতে:

<a href="http://examplewebsite.com/">

অন্যান্য ওয়েবসাইট রয়েছে .net, .govতবে আমি ধরে নিচ্ছি আমি ঠিক আগেই কাট অফ পয়েন্ট তৈরি করতে পারব >। সুতরাং আমি জানি আমি HTTP এবং .com এর আগে সমস্ত কিছু কেটে ফেলার জন্য গ্রেপ ব্যবহার করতে পারি এবং কোনওভাবে কাটতে পারি তবে আমি এটির জন্য কিছুক্ষণ আটকে আছি।


আমি এটি সম্পাদনা করেছি। কিছু <এবং a এর মধ্যে স্থান উপেক্ষা করার জন্য, HTML এটি ছাড়া প্রদর্শিত হবে না। এটি ধরার জন্য ধন্যবাদ!
এলটিগ্রে

কোড বিন্যাস ব্যবহার করুন (পাঠ্যটি নির্বাচন করুন এবং Ctrl-K টিপুন)। অন্যথায় <>এটি এইচটিএমএল ট্যাগ হিসাবে দেখাতে বাধ্য করে।
মুড়ু

href প্যারামিটারের উদ্বোধনী এবং শেষের উদ্ধৃতিটি কেন মিলছে না? তদতিরিক্ত, আমি বিশ্বাস করি যে নিয়মিত প্রকাশগুলি এইচটিএমএল এর জন্য সবচেয়ে উপযুক্ত নয়।
友情 留 在 无

আমি বিশেষত গ্রেপ ব্যবহার করে একটি কমান্ড লিখতে চাই এবং এটি করতে কাটছি। আমি বুঝতে পারি যে অন্যান্য উপায় আছে তবে আমি সেগুলি সম্পর্কে জানতে চেয়েছিলাম।
এলটিগ্রে

9
সাধারণভাবে এইচটিএমএলকে নিয়মিত এক্সপ্রেশন দিয়ে পার্স করা ভাল ধারণা নয়, কারণ এইচটিএমএল কোনও নিয়মিত ভাষা নয়। আপনি করতে পারেন গ্যারান্টি যে এইচটিএমএল তুমি পার্সিং মোটামুটি সহজ, এবং যে জিনিস নিয়ে আপনি নির্যাস করার চেষ্টা করছেন আন্দাজের আপনি পারে এটি দিয়ে পার পেতে করতে সক্ষম হবেন। কিন্তু দয়া করে দেখুন stackoverflow.com/a/1732454/4014959
প্রধানমন্ত্রী 2Ring

উত্তর:


25

যেমনটি আমি আমার মন্তব্যে বলেছি, সাধারণত নিয়মিত এক্সপ্রেশন দিয়ে HTML পার্স করা ভাল ধারণা নয়, তবে আপনি যে এইচটিএমএলটি পার্স করছেন তা যদি ভাল আচরণ করে তবে আপনি কখনও কখনও এটি থেকে দূরে সরে যেতে পারেন।

উপাদানগুলির hrefবৈশিষ্ট্যে থাকা কেবলমাত্র ইউআরএলগুলি পেতে <a>, একাধিক পর্যায়ে এটি করা আমার পক্ষে সহজ। আপনার মন্তব্যগুলি থেকে দেখে মনে হচ্ছে আপনি সম্পূর্ণ শীর্ষস্থানীয় URL নয়, কেবল শীর্ষ স্তরের ডোমেন চান। সেক্ষেত্রে আপনি এরকম কিছু ব্যবহার করতে পারেন:

grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' | 
grep -Eo '(http|https)://[^/"]+'

যেখানে source.htmlবিশ্লেষণ করতে HTML কোড ধারণকারী ফাইল।

এই কোডটি সমস্ত শীর্ষ-স্তরের ইউআরএলগুলি মুদ্রণ করবে যা প্রতিটি লাইনের hrefকোনও <a>উপাদানের বৈশিষ্ট্য হিসাবে ঘটে । -iপ্রথম বিকল্প grepকমান্ড তা নিশ্চিত করার জন্য এটি উভয় কাজ করবে হয় <a>এবং <A>উপাদান। আমার ধারণা, আপনি ওপরের কেস বৈশিষ্ট্যগুলি ক্যাপচার -iকরতে ২ য় জনকেও দিতে grepপারেন HREF, OTOH, আমি এই জাতীয় ভাঙা এইচটিএমএল উপেক্ষা করতে পছন্দ করব। :)

এর বিষয়বস্তু প্রক্রিয়া করতে http://google.com/

wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' | 
grep -Eo 'href="[^\"]+"' | 
grep -Eo '(http|https)://[^/"]+'

আউটপুট

http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au

অস্ট্রেলিয়ান গুগল পৃষ্ঠায় আমি পুনঃনির্দেশিত হওয়ায় আমার আউটপুট অন্যান্য উদাহরণগুলির থেকে কিছুটা আলাদা।


ধন্যবাদ. এখন এই আমি ঠিক খুঁজছিলাম ছিল। এটি এটি করার সবচেয়ে পরিষ্কার উপায়।
এলটিগ্রে

@ এলটিগ্রে: আমার আনন্দ! তবে দয়া করে উপরের আমার মন্তব্যে আমি যে সতর্কতাটি সংযুক্ত করেছি সেদিকে খেয়াল রাখুন। :)
প্রধানমন্ত্রী 2Ring

আমি সহজ পয়েন্টগুলির প্রত্যাশায় এই প্রশ্নে এসেছি ... এবং আপনি ইতিমধ্যে মাথার পেরেকটি সম্পূর্ণরূপে আঘাত করেছিলেন
মার্ক কে কোয়ান

ধন্যবাদ, @ মারককেউয়ান :) এফডাব্লুআইডাব্লু, আমি প্রথমে জাজটি ব্যবহার করে একটি উত্তর লিখতে শুরু করেছিলাম, তবে তারপরে আমি স্থির করেছিলাম যে গ্রেপ-ভিত্তিক সমাধানটি অ্যাজকের সাথে পরিচিত নয় তাদের পক্ষে বোঝা সহজ হবে। এবং যাইহোক, উপরের কোডটি আমার অ্যাডক কোডের চেয়ে ছোট।
প্রধানমন্ত্রী 2 রিং

2
@ মামাভিলজ: কারণ ওপি কেবল শীর্ষ স্তরের ডোমেন চেয়েছিল, সুতরাং ://আমরা কেবল প্রথম /বা এর আগে চরগুলি গ্রহণ করি "। তবে আপনি যদি পুরো ইউআরএল দেখতে চান তবে সেই আদেশটি এতে পরিবর্তন করুন grep -Eo '(http|https)://[^"]+। এই লাইনের জন্য অন্য একটি বিকল্প grep -Eo '(http|https)://[^?"]+'যা কোয়েরি বিকল্পগুলি বন্ধ করে দেয়। যাইহোক, এই প্রকরণটি এখনও ইউআরএলগুলি মুদ্রণ করবে যা ক্যোয়ারী প্যারামিটার হিসাবে অন্য URL এর মধ্যে রয়েছে তবে সেগুলি আলাদা লাইনে মুদ্রিত হবে।
প্রধানমন্ত্রী 2 রিং

25

আপনি সরঞ্জামগুলিতে সীমাবদ্ধ কিনা তা নিশ্চিত নন:

তবে রেগেক্স সম্ভবত উল্লিখিতভাবে যাওয়ার সর্বোত্তম উপায় নাও হতে পারে তবে আমি এখানে এক উদাহরণ রেখেছি:

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
  • গ্রেপ-ই: এগ্রিপ-এর মতোই
  • গ্রেপ -o: গ্রেপ করা হয়েছে কেবল কেবল ফলাফলগুলি
  • (http | https): হ'ল একটি / বা or
  • আজ: সমস্ত নিম্নতর ক্ষেত্রে
  • এজেড: সমস্ত আপের কেস
  • । : বিন্দু হয়
  • ? ?: হয়?
  • *: হ'ল [...] গোষ্ঠীর পুনরাবৃত্তি
  • ইউনিক: যে কোনও সদৃশ সরিয়ে ফেলবে

আউটপুট:

bob@bob-NE722:~s$  wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...

আপনি \dঅন্যান্য সংখ্যার ধরণগুলি যোগ করতেও যোগ করতে পারেন ।


2
আইআরআই রেজেক্সেস! এর মধ্যে একটি ব্যবহার করুন এবং ওপিটিকে ভয় দেখান! :)
মুড়ু

2
@ মুরু ... কাঁপছে আমি ... আমি কী বলব জানি না। এগুলি কি বাস্তব !?
জুমুনশ

4
@ জুমুনস, ইউনিক কেবল সংলগ্ন সদৃশগুলি সরিয়ে ফেলুন। sort -u?
জাজাও

1
এটি দুর্দান্ত কাজ করে, সেরা উত্তর !!
গিরি

@ জাজোও কি পাইপিংয়ের চেয়ে দ্রুত সাজানোর উত্স? শুধু একটি চিন্তার পরীক্ষা, আইডি দেখতে হবে। তবে আপনি সম্ভবত শেল মিডলওয়্যার সম্পর্কে ঠিক বলেছেন।
জুমুনশ

9

যদি আপনার গ্রেপ পার্ল রেজেক্সেসকে সমর্থন করে:

grep -Po '(?<=href=")[^"]*(?=")'
  • (?<=href=")এবং (?=")হয় lookaround জন্য এক্সপ্রেশন hrefঅ্যাট্রিবিউট। এটি -Pবিকল্প প্রয়োজন।
  • -o মিলে যাওয়া পাঠ্য মুদ্রণ করে।

উদাহরণ স্বরূপ:

$ curl -sL https://www.google.com | grep -Po '(?<=href=")[^"]*(?=")'
/search?
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?gl=IN&tab=w1
https://news.google.co.in/nwshp?hl=en&tab=wn
...

যথারীতি, কোনও গ্যারান্টি নেই যে এগুলি বৈধ ইউআরআই, বা আপনি যে এইচটিএমএলটি পার্স করছেন তা বৈধ হবে।


8

হিসেবে অ Regex বিকল্প , ব্যবহার কুকুরছানা :

pup 'a[href] attr{href}' < yourfile.html

aএকটি hrefবৈশিষ্ট্যযুক্ত সমস্ত উপাদান সন্ধান করবে , তারপরে গুণাবলীর মান প্রদর্শন করবে href

ইনস্টল করতে pupআপনার গো (একটি প্রোগ্রামিং ভাষা) দরকার:

sudo apt-get install golang
sudo go get github.com/ericchiang/pup

এই সমাধান সুবিধা হল যে এটা সঠিকভাবে ফরম্যাট হচ্ছে এইচটিএমএল ওপর নির্ভর করে না


1
+1 এর জন্য pupএটি ইনস্টল করার সময় ....
মার্ক কে কোয়ান

আপনি এগুলি ফাইলগুলিতেও রাখতে পারেন। pup 'a.classname[href] attr{href}' < tut.html >links.md
আহমদ আওয়াস

1

আমি এখানে একটি সমাধান খুঁজে পেয়েছি যা আইএমএইচও এটি এখানে প্রস্তাবিত চেয়ে অনেক সহজ এবং সম্ভাব্য দ্রুত। আমি https ফাইলগুলি সমর্থন করতে কিছুটা সামঞ্জস্য করেছি। তবে টিডি; টিআর সংস্করণটি হ'ল ...

পিএস: আপনি সাইটের ইউআরএলটিকে কোনও ফাইলের পাথের সাথে প্রতিস্থাপন করতে পারেন এবং এটি একইভাবে কাজ করবে।

lynx -dump -listonly -nonumbers "http://www.goggle.com" > links.txt

lynx -dump -listonly -nonumbers "some-file.html" > links.txt

আপনি যদি লিঙ্কগুলিকে কোনও ফাইলের মধ্যে না রেখে কেবল দেখতে চান তবে তার পরিবর্তে এটি চেষ্টা করুন ...

lynx -dump -listonly -nonumbers "http://www.google.com"

lynx -dump -listonly -nonumbers "some-file.html"

ফলাফলটি নিম্নলিখিতগুলির মতো দেখাবে ...

http://www.google.ca/imghp?hl=en&tab=wi
http://maps.google.ca/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?gl=CA&tab=w1
http://news.google.ca/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
https://www.google.ca/intl/en/options/
http://www.google.ca/history/optout?hl=en
...
etc.

আমার ব্যবহারের ক্ষেত্রে, এটি ঠিক কাজ করেছে। তবে এ থেকে সাবধান থাকুন যে, আজকাল মানুষ লাইব্রেরির সিডিএন ইউআরআইয়ের জন্য src = "// blah.tld" এর মতো লিঙ্ক যুক্ত করে। আমি পুনরুদ্ধার করা লিঙ্কগুলিতে সেগুলি দেখতে চাইনি।

লিঙ্কগুলির জন্য href বা অন্যান্য উত্সগুলি পরীক্ষা করার চেষ্টা করার দরকার নেই কারণ "লিনাক্স -ডাম্প" প্রদত্ত পৃষ্ঠা থেকে ডিফল্টরূপে সমস্ত ক্লিকযোগ্য লিঙ্কগুলি বের করে দেবে। সুতরাং এর পরে আপনার কেবলমাত্র ভাবার দরকার হ'ল একই ফলাফলের ক্লিনার কাঁচা সংস্করণ পেতে গ্রেপ ব্যবহার করে "লিনাক্স -ডাম্প" এর ফলাফলটি বিশ্লেষণ করা।


তবে প্রশ্নটি বলেছে "একটি HTML ফাইল থেকে URL গুলি বের করুন [যা দেখতে ভালো লাগে" (উদাহরণস্বরূপ)), "কোনও ওয়েব পৃষ্ঠা থেকে URL গুলি বের করবেন না "। আপনার উত্তরটি যদি স্থানীয় মেশিনে থাকা কোনও ফাইলের বিরুদ্ধে ব্যবহার করা যায়, তবে কীভাবে তা ব্যাখ্যা করুন। মন্তব্যে প্রতিক্রিয়া জানাতে দয়া করে; আপনার উত্তরটি আরও পরিষ্কার এবং আরও পরিপূর্ণ করতে সম্পাদনা করুন।
জি-ম্যান

1
আপনি ফাইলের নামের মাধ্যমে URL টি প্রতিস্থাপন করতে পারেন।
asiby

@ জি-ম্যান, কেন -1? আপনার নিজের কোডটি চেষ্টা করে দেখতে হবে এবং এটি স্থানীয় ফাইলগুলির জন্যও কাজ করে। আমি স্পষ্টতা এটি স্পষ্ট ছিল না ক্ষেত্রে যোগ করেছেন।
asiby

এটি সত্যিই সহজ .. যদি আপনি xargs দিয়ে ব্যবহার করেন তবে এটি যুক্ত করার উপযুক্ত সাজানো | সদৃশ লিঙ্কগুলি ছাঁটাই করতে ইউনিক।
স্টুয়ার্ট অ্যাকসন

0
wget -qO- google.com |
tr \" \\n | grep https\*://

... সম্ভবত বেশ ভাল করতে হবে। লিখিত হিসাবে, এটি মুদ্রণ:

http://schema.org/WebPage
http://www.google.com/imghp?hl=en&tab=wi
http://maps.google.com/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?tab=w1
http://news.google.com/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
http://www.google.com/intl/en/options/
http://www.google.com/history/optout?hl=en
https://accounts.google.com/ServiceLogin?hl=en&continue=http://www.google.com/
https://www.google.com/culturalinstitute/project/the-holocaust?utm_source=google&amp;utm_medium=hppromo&amp;utm_campaign=auschwitz_q1&amp;utm_content=desktop
https://plus.google.com/116899029375914044550

যদি আপনি কেবল লিঙ্কগুলি মেলে এবং সেই শীর্ষ স্তরের ডোমেনগুলির মধ্যে থেকে গুরুত্বপূর্ণ হন তবে আপনি এটি করতে পারেন:

wget -qO- google.com |
sed '/\n/P;//!s|<a[^>]*\(https*://[^/"]*\)|\n\1\n|;D'

... বা এটির মতো কিছু - যদিও কিছু sedস এর জন্য আপনাকে \nশেষ দু'জনের প্রত্যেকটির জন্য একটি আক্ষরিক ইওলাইন চরিত্রের বিকল্পের প্রয়োজন হতে পারে n

যেমন লেখা আছে, উপরের কমান্ডটি প্রিন্ট করে:

http://www.google.com
http://maps.google.com
https://play.google.com
http://www.youtube.com
http://news.google.com
https://mail.google.com
https://drive.google.com
http://www.google.com
http://www.google.com
http://www.google.com
https://www.google.com
https://plus.google.com

... এবং উভয় ক্ষেত্রে (তবে সম্ভবত পরবর্তীকালের সাথে সবচেয়ে কার্যকরভাবে) আপনি |sort -uতালিকাটি sortসম্পাদনা করতে এবং ডুপ্লিকেটগুলি ফেলে দেওয়ার জন্য একটি ফিল্টারটি শেষ পর্যন্ত দেখতে পারেন ।



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.