কমান্ড লাইন ব্যবহার করে আমি কীভাবে কোনও ওয়েবসাইটের শিরোনাম পাব?


50

আমি একটি কমান্ড লাইন প্রোগ্রাম চাই যা কোনও ওয়েবসাইটের শিরোনাম ছাপায়। যেমন:

Alan:~ titlefetcher http://www.youtube.com/watch?v=Dd7dQh8u4Hc

দিতে হবে:

Why Are Bad Words Bad? 

আপনি এটি url দিন এবং এটি শিরোনামটি প্রিন্ট করে।


2
আমি যখন শিরোনামটি ডাউনলোড করি তখন আমি পেয়েছি: "খারাপ শব্দগুলি খারাপ কেন? - ইউটিউব", আপনি কি "- ইউটিউব" কে খুব ছোট করে রাখতে চান?
slm

উত্তর:


44
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'

recodeএর মতো জিনিস থাকলে আপনি এটি জিএনইউতে পাইপ করতে পারেন &lt;:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' |
  recode html..

- youtubeঅংশটি সরাতে :

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
 perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)(?: - youtube)?\s*<\/title/si'

কিছু সীমাবদ্ধতা নির্দেশ করতে:

বহনযোগ্যতা

এইচটিটিপি কোয়েরি করার জন্য কোনও স্ট্যান্ডার্ড / পোর্টেবল কমান্ড নেই। কয়েক দশক আগে, আমি lynx -sourceএখানে পরিবর্তে সুপারিশ করা উচিত । তবে আজকাল wgetএটি আরও বহনযোগ্য কারণ এটি বেশিরভাগ জিএনইউ সিস্টেমে ডিফল্টরূপে পাওয়া যায় (বেশিরভাগ লিনাক্স ভিত্তিক ডেস্কটপ / ল্যাপটপ অপারেটিং সিস্টেম সহ)। অন্যান্য মোটামুটি বহনযোগ্য পোর্টেবলগুলির মধ্যে GETকমান্ডটি অন্তর্ভুক্ত থাকে perlযা প্রায়শই ইনস্টল হওয়া লিবিউডব্লিউ সাথে আসে lynx -sourceএবং কিছুটা কম পরিমাণে curl। অন্যান্য সাধারণ বেশী অন্তর্ভুক্ত links -source, elinks -source, w3m -dump_source, lftp -c cat...

এইচটিটিপি প্রোটোকল এবং পুনর্নির্দেশ পরিচালনা

wgetউদাহরণস্বরূপ firefoxপ্রদর্শিত পৃষ্ঠার মতো একই পৃষ্ঠাটি নাও পেতে পারে । এইচটিটিপি সার্ভারগুলি ক্লায়েন্টের দ্বারা প্রেরিত অনুরোধে প্রদত্ত তথ্যের ভিত্তিতে একটি ভিন্ন পৃষ্ঠা প্রেরণ চয়ন করতে পারে তার কারণ।

উইজেট / ডাব্লু 3 এম / জিইটি ... এর মাধ্যমে প্রেরিত অনুরোধটি ফায়ারফক্সের পাঠানো থেকে আলাদা হতে চলেছে। যদি এটি কোনও সমস্যা হয় wgetতবে বিকল্প হিসাবে অনুরোধটি প্রেরণের পদ্ধতিটি পরিবর্তন করতে আপনি আচরণকে পরিবর্তন করতে পারেন ।

এই বিষয়ে এখানে সর্বাধিক গুরুত্বপূর্ণগুলি হ'ল:

  • Acceptএবং Accept-language: এটি সার্ভারকে জানায় যে ক্লায়েন্টটি কোন ভাষাতে এবং চার্সেটে ক্লায়েন্টটি প্রতিক্রিয়া পেতে চায় সেটিকে wgetডিফল্টরূপে কোনও পাঠায় না যাতে সার্ভার সাধারণত তার ডিফল্ট সেটিংস সহ প্রেরণ করে। firefoxঅন্য প্রান্তে সম্ভবত আপনার ভাষার জন্য অনুরোধ করার জন্য কনফিগার করা হয়েছে।
  • User-Agent: এটি সার্ভারে ক্লায়েন্ট অ্যাপ্লিকেশন সনাক্ত করে। কিছু সাইট ক্লায়েন্টের উপর ভিত্তি করে বিভিন্ন সামগ্রী প্রেরণ করে (যদিও এটি বেশিরভাগ ক্ষেত্রে জাভাস্ক্রিপ্ট ভাষার ব্যাখ্যাগুলির মধ্যে পার্থক্যের জন্য) এবং আপনি যদি কোনও রোবট- টাইপ ব্যবহারকারী এজেন্ট ব্যবহার করেন তবে আপনাকে পরিবেশন করতে অস্বীকার করতে পারে wget
  • Cookie: আপনি যদি এই সাইটটি এর আগে দেখেছেন তবে আপনার ব্রাউজারে এটির জন্য স্থায়ী কুকিজ থাকতে পারে। wgetহবে না.

wgetপুনরায়নির্দেশগুলি HTTP প্রোটোকল স্তরে সম্পন্ন করার পরে তা অনুসরণ করবে, তবে যেহেতু এটি পৃষ্ঠাটির বিষয়বস্তুটিতে নজর দিচ্ছে না, জাভাস্ক্রিপ্ট বা এর মতো জিনিস দ্বারা করা হয়েছে না <meta http-equiv="refresh" content="0; url=http://example.com/">

পারফরমেন্স / দক্ষতা

এখানে, অলসতার বাইরে, আমরা ট্যাগটি perlসন্ধান করার আগে পুরো সামগ্রীটি মেমরিতে পড়েছি <title>। প্রদত্ত যে শিরোনামটি <head>ফাইলের প্রথম কয়েকটি বাইটে থাকা বিভাগে পাওয়া যায় , এটি অনুকূল নয়। awkআপনার সিস্টেমে জিএনইউ উপলব্ধ থাকলে আরও ভাল উপায় হতে পারে:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  gawk -v IGNORECASE=1 -v RS='</title' 'RT{gsub(/.*<title[^>]*>/,"");print;exit}'

এইভাবে, awk প্রথমটির পরে পড়া বন্ধ করে দেয় </titleএবং প্রস্থান করে wgetডাউনলোড করা বন্ধ করে দেয়।

এইচটিএমএল পার্সিং

এখানে, wgetপৃষ্ঠাটি ডাউনলোড হওয়ার সাথে সাথে লিখেছে। একই সময়ে, perlতার আউটপুট (slurps -0777 -n) মেমরি পুরো এবং তারপর HTML কোড দেব যা প্রথম ঘটনার মধ্যে পাওয়া যায় ছাপে <title...>এবং </title

এটি বেশিরভাগ এইচটিএমএল পৃষ্ঠাগুলির জন্য কাজ করবে যেগুলিতে একটি <title>ট্যাগ রয়েছে, তবে এমন কেস রয়েছে যেখানে এটি কাজ করবে না।

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

আমার সমাধান এবং কফিমগ উভয় বিভিন্ন কোণার ক্ষেত্রে ব্যর্থ হবে, কখনও কখনও একই, কখনও কখনও না।

উদাহরণস্বরূপ, আমার এতে ব্যর্থ হবে:

<html><head foo="<title>"><title>blah</title></head></html>

বা:

<!-- <title>old</title> --><title>new</title>

যদিও তার ব্যর্থ হবে:

<TITLE>foo</TITLE>

(বৈধ এইচটিএমএল, এক্সএমএল নয়) বা:

বা:

<title>...</title>
...
<script>a='<title>'; b='</title>';</script>

(আবারও, বৈধ এক্সএমএল করার জন্য বৈধ html, অনুপস্থিত <![CDATA[অংশগুলি)।

<title>foo <<<bar>>> baz</title>

(ভুল এইচটিএমএল, তবে এখনও এটি খুঁজে পেয়েছি এবং বেশিরভাগ ব্রাউজার দ্বারা সমর্থিত)

ট্যাগ ভিতরে কোড ব্যাখ্যা।

এই সমাধানটি <title>এবং এর মধ্যে কাঁচা পাঠ্যকে আউটপুট করে </title>। সাধারণত, সেখানে কোনও এইচটিএমএল ট্যাগ থাকা উচিত নয়, সেখানে সম্ভবত মন্তব্য থাকতে পারে (যদিও ফায়ারফক্সের মতো কিছু ব্রাউজারগুলি এতটা সম্ভব নয়)। এখনও কিছু HTML এনকোডিং থাকতে পারে:

$ wget -qO- 'http://www.youtube.com/watch?v=CJDhmlMQT60' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
Wallace &amp; Gromit - The Cheesesnatcher Part 1 (claymation) - YouTube

যার যত্ন নেওয়া জিএনইউ recode:

$ wget -qO- 'http://www.youtube.com/watch?v=CJDhmlMQT60' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' |
   recode html..
Wallace & Gromit - The Cheesesnatcher Part 1 (claymation) - YouTube

তবে ওয়েব ক্লায়েন্টকে শিরোনামটি প্রদর্শন করার সময় সেই কোডটিতে আরও রূপান্তর করা বোঝানো হয় (যেমন শূন্যের কিছু অংশ ঘনিয়ে দেওয়া, নেতৃস্থানীয় এবং অনুসরণকারীকে সরিয়ে ফেলা)। তবে এটির জন্য কোনও প্রয়োজন হওয়ার সম্ভাবনা কম। সুতরাং, অন্যান্য ক্ষেত্রে যেমন, এটি চেষ্টা করার পক্ষে এটি মূল্যবান কিনা তা সিদ্ধান্ত নেওয়া আপনার পক্ষে।

অক্ষর সেট

ইউটিএফ -8 এর আগে, আইএসও 8859-1 অ-এসসিআইআই অক্ষরগুলির জন্য ওয়েবে পছন্দের চার্সেট হিসাবে ব্যবহৃত হত যদিও কড়া ভাষায় সেগুলি লিখতে হয়েছিল &eacute;। এইচটিটিপি এবং এইচটিএমএল ভাষার আরও সাম্প্রতিক সংস্করণগুলি এইচটিটিপি শিরোনামে বা এইচটিএমএল শিরোনামে অক্ষর সেটটি নির্দিষ্ট করার সম্ভাবনা যুক্ত করেছে এবং একটি ক্লায়েন্ট এটি গ্রহণ করা অক্ষরগুলি নির্দিষ্ট করতে পারে। ইউটিএফ -8 আজকাল ডিফল্ট চরসেট হয়ে থাকে।

সুতরাং, যে যে মানে, আপনি করব খুঁজে éহিসাবে লিখিত &eacute;, যেমন &#233;, হল UTF-8 যেমন é2 গত বেশী জন্য, (0xc3 0xa9), iso- 8859-1 (0xe9) হিসাবে, সঙ্গে, অক্ষরসেট উপর মাঝে মাঝে তথ্য HTTP শিরোনাম বা এইচটিএমএল শিরোনামে (বিভিন্ন ফর্ম্যাটে), কখনও কখনও না।

wget এটি কেবল কাঁচা বাইট পায়, এটি অক্ষর হিসাবে তাদের অর্থের বিষয়ে চিন্তা করে না এবং এটি ওয়েব সার্ভারকে পছন্দের অক্ষর সম্পর্কে জানায় না।

recode html..আপনার সিস্টেমে ব্যবহৃত অক্ষর সেটের জন্য বাইটের যথাযথ ক্রমে &eacute;বা রূপান্তরিত করার জন্য যত্ন নেবে &#233;, তবে বাকীগুলির জন্য, এটি আরও জটিল।

যদি আপনার সিস্টেমের চরসেটটি অফ -8 হয় তবে এটি বেশিরভাগ সময় ঠিকঠাক হয়ে যাবে কারণ আজকাল সেখানে ব্যবহৃত ডিফল্ট চরসেট হিসাবে দেখা যায়।

$ wget -qO- 'http://www.youtube.com/watch?v=if82MGPJEEQ' |
 perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
Noir Désir - L&#39;appartement - YouTube

এটি éউপরে একটি ইউটিএফ -8 ছিল é

তবে আপনি যদি অন্যান্য চারসেটের জন্য কভার করতে চান তবে আবার এটির যত্ন নেওয়া উচিত।

এটিও লক্ষ করা উচিত যে এই সমাধানটি ইউটিএফ -16 বা ইউটিএফ -32 এনকোডযুক্ত পৃষ্ঠাগুলির জন্য মোটেও কাজ করবে না।

যোগফল

আদর্শভাবে, আপনার এখানে যা প্রয়োজন তা হল তথ্য দেওয়ার জন্য একটি আসল ওয়েব ব্রাউজার। এটি হ'ল, সঠিক পরামিতিগুলির সাথে আপনার HTTP অনুরোধটি করার কিছু দরকার, HTTP প্রতিক্রিয়াটি সঠিকভাবে ব্যাখ্যা করতে, এইচটিএমএল কোডটিকে ব্রাউজার হিসাবে পুরোপুরি ব্যাখ্যা করতে এবং শিরোনামটি ফিরিয়ে আনতে হবে।

যেহেতু আমি জানি না যে কমান্ড লাইনে আমি জানি ব্রাউজারগুলির সাথে এটি করা সম্ভব (যদিও এখন এই কৌশলটি দিয়ে দেখুনlynx ), আপনাকে হিউরিস্টিক্স এবং আনুমানিকতা অবলম্বন করতে হবে এবং উপরের একটিটি যে কোনওটির মতোই দুর্দান্ত।

আপনি পারফরম্যান্স, সুরক্ষাও বিবেচনায় নিতে চাইতে পারেন ... উদাহরণস্বরূপ, সমস্ত কেস কভার করার জন্য (উদাহরণস্বরূপ, একটি ওয়েব পৃষ্ঠা যা কোনও তৃতীয় পক্ষের সাইট থেকে কিছু জাভাস্ক্রিপ্ট টানা আছে যা শিরোনাম সেট করে বা একটিতে অন্য পৃষ্ঠায় পুনঃনির্দেশিত করে অনলোড হুক), আপনাকে তার ডম এবং জাভাস্ক্রিপ্ট ইঞ্জিন সহ একটি বাস্তব জীবন ব্রাউজারটি প্রয়োগ করতে হতে পারে যা একক এইচটিএমএল পৃষ্ঠার জন্য কয়েকশ জিজ্ঞাসা করতে হতে পারে, যার মধ্যে কয়েকটি দুর্বলতা কাজে লাগানোর চেষ্টা করছে ...

HTML কে পার্স করতে regexps ব্যবহার করার সময় প্রায়শই ভ্রূণরঞ্জন করা হয় , এখানে একটি সাধারণ কেস রয়েছে যেখানে এটি টাস্কের জন্য যথেষ্ট উপযুক্ত (আইএমও)।


এটি কি পৃষ্ঠাগুলি থেকে চিত্রগুলি ডাউনলোড করে? এছাড়াও এটি কি জাঙ্ক এইচটিএমএল ফাইলগুলি পিছনে ফেলে দেবে?
ইউফোগ্যু

2
আপনি সম্ভবত প্রথম দফায় শিরোনামটি শেষ করতে চান <যেহেতু শিরোনামগুলির শেষ ট্যাগ থাকার গ্যারান্টি নেই এবং অন্য কোনও ট্যাগের সমাপ্তিটি বাধ্য করা উচিত। আপনি নতুন লাইন ফেলা করতে চাইতে পারেন।
ব্রায়ান নিকেল

1
এইচটিএমএল পার্স করার জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করার পরামর্শ দেওয়া হয় না। কখনো। এমনকি এই ক্ষেত্রে না। এটি একটি খারাপ অভ্যাস। পরিবর্তে একটি বাস্তব পার্সার ব্যবহার করুন। এটি সম্পর্কে একটি বিখ্যাত মজাদার স্ট্যাকওভারফ্লো উত্তর রয়েছে ...
রবিন গ্রিন

4
@ রবিনগ্রিন এই পোস্টটি একটি নিয়মিত নয় এমন ভাষা পার্স করার জন্য রেজেক্স ব্যবহার করার কথা ছিল about সাবধানতা অবলম্বন রয়েছে, তবে এটি এমন একটি সমস্যা যা সহজেই নিয়মিত ভাষায় হ্রাস পায়। আমি এইচটিএমএল পার্স করার জন্য রেজেক্স ব্যবহার করার পরামর্শ দিচ্ছি। কখনও কখনও। এক্ষেত্রে.
ব্রায়ান নিকেল

2
এবং প্রায় প্রতিটি কিছুর জন্য নিয়মিত এক্সপ্রেশনগুলির সংখ্যা প্রায় 0
রবিন গ্রিন

27

এছাড়াও আপনি চেষ্টা করে দেখতে পারেন hxselect(থেকে এইচটিএমএল-এক্সএমএল-utils সঙ্গে) wgetনিম্নরূপ:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' | hxselect -s '\n' -c  'title' 2>/dev/null

আপনি ইনস্টল করতে পারেন hxselectব্যবহার ডেবিয়ান ভিত্তিক ডিস্ট্রো মধ্যে:
sudo apt-get install html-xml-utils

STDERR পুনঃনির্দেশ Input is not well-formed. (Maybe try normalize?)বার্তা এড়ানো হয় ।

"- YouTube" থেকে মুক্তি পাওয়ার জন্য উপরের কমান্ডের আউটপুটটি পাইপ করুন awk '{print substr($0, 0, length($0)-10)}'


"hxselect" উবুন্টুতে ডিফল্টরূপে ইনস্টল করা আছে বলে মনে হয় না। এমনকি আমি এটি আমার বিদ্যমান সংগ্রহস্থলগুলিতে খুঁজে পেতে পারি না। আমি কীভাবে এটি ইনস্টল করব?
ইউফোগুয়ে

7
sudo apt-get install html-xml-utils
coffeMug

উবুন্টু ১২.১০ এ আমি এই ত্রুটিটি পেয়েছি "ইনপুটটি সুগঠিত নয় ((সম্ভবত স্বাভাবিক করার চেষ্টা করুন?)"
স্ল্যাম

1
এই চিত্রটি দিয়ে কী করব তা আমি খুঁজে পাইনি। আউটপুট স্বাভাবিককরণ সম্পর্কে। এ জাতীয় কোনও স্যুইচ অন নেই hxselect
slm

1
ম্যাক ওএস এক্স লোকদের জন্য হোমব্রিউতে hxselect সহ একটি সূত্র রয়েছে। সাথে ইনস্টল করুন brew install html-xml-utils
সুকিমা

18

এছাড়াও আপনি ব্যবহার করতে পারেন curlএবং grepএই কাজ করতে। আপনি ব্যবহার পক্ষভুক্ত করতে হবে PCRE (পার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন) মধ্যে grepযাতে আমরা জানতে পারেন পিছনে তাকান পেতে এবং সুবিধা এগিয়ে দেখুন <title>...</title>ট্যাগ।

উদাহরণ

$ curl 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -so - | \
    grep -iPo '(?<=<title>)(.*)(?=</title>)'
Why Are Bad Words Bad? - YouTube

বিস্তারিত

curlসুইচ:

  • -s = নীরব
  • -o - = STDOUT এ আউটপুট প্রেরণ করুন

grepসুইচ:

  • -i = ক্ষেত্রে সংবেদনশীলতা
  • -o = মেলে কেবল সেই অংশটি ফেরত দিন
  • -P = পিসিআরই মোড

প্যাটার্ন grep:

  • (?<=<title>) = এটির বামদিকে শুরু হওয়া একটি স্ট্রিং সন্ধান করুন
  • (?=</title>) = এর ডানদিকে শেষ হওয়া একটি স্ট্রিং সন্ধান করুন
  • (.*)= এর মাঝে সমস্ত কিছু <title>..</title>

আরও জটিল পরিস্থিতি

যদি <title>...</titie>একাধিক লাইন বিস্তৃত হয়, তবে উপরেরটি এটি খুঁজে পাবে না। আপনি trকোনও \nঅক্ষর, অর্থাৎ মুছতে ব্যবহার করে এই পরিস্থিতি প্রশমিত করতে পারেন tr -d '\n'

উদাহরণ

নমুনা ফাইল।

$ cat multi-line.html 
<html>
<title>
this is a \n title
</TITLE>
<body>
<p>this is a \n title</p>
</body>
</html>

এবং একটি নমুনা রান:

$ curl 'http://www.jake8us.org/~sam/multi-line.html' -so - | \
     tr -d '\n' | \
     grep -iPo '(?<=<title>)(.*)(?=</title>)'
this is a \n title

? lang = ...

যদি <title>সেটটি এমনভাবে সেট করা থাকে, <title lang="en">তবে grepএটির আগে আপনাকে এটি সরিয়ে ফেলতে হবে। সরঞ্জামটি sedএটি করতে ব্যবহৃত হতে পারে:

$ curl 'http://www.jake8us.org/~sam/multi-line.html' -so - | \
     tr -d '\n' | \
     sed 's/ lang="\w+"//gi' | \
     grep -iPo '(?<=<title>)(.*)(?=</title>)'
this is a \n title

উপরেরটি lang=একটি শব্দ সিকোয়েন্স ( \w+) এর পরে কেস সংবেদনশীল স্ট্রিংয়ের সন্ধান করে । এটি তখন ছিটকে যায়।

একটি আসল এইচটিএমএল / এক্সএমএল পার্সার - রুবি ব্যবহার করে

এক পর্যায়ে রেজেক্স এই ধরণের সমস্যা সমাধানে ব্যর্থ হবে। যদি এটি ঘটে থাকে তবে আপনি সম্ভবত একটি আসল এইচটিএমএল / এক্সএমএল পার্সার ব্যবহার করতে চান। এরকম একটি পার্সার হলেন নোকোগিরি । এটি রুবিতে রত্ন হিসাবে উপলব্ধ এবং এটির মতো ব্যবহার করা যেতে পারে:

$ curl 'http://www.jake8us.org/~sam/multi-line.html' -so - | \
    ruby -rnokogiri -e \
     'puts Nokogiri::HTML(readlines.join).xpath("//title").map { |e| e.content }'

this is a \n title

উপরেরটি curlএইচটিএমএল ( Nokogiri::HTML) হিসাবে আসে এমন ডেটা বিশ্লেষণ করছে । xpathএরপরে পদ্ধতিটি এইচটিএমএলে নোড (ট্যাগ) সন্ধান করে যা লিফ নোড, ( //) নামের সাথে title। প্রত্যেকটির জন্য আমরা এর সামগ্রী ( e.content) ফিরিয়ে দিতে চাই । putsতারপর তাদের আউট ছাপে।

একটি প্রকৃত এইচটিএমএল / এক্সএমএল পার্সার - পার্ল ব্যবহার করে

আপনি পার্ল এবং এইচটিএমএল :: ট্রিবিল্ডার :: এক্সপথ মডিউলটির সাথেও অনুরূপ কিছু করতে পারেন ।

$ cat title_getter.pl
#!/usr/bin/perl

use HTML::TreeBuilder::XPath;

$tree = HTML::TreeBuilder::XPath->new_from_url($ARGV[0]); 
($title = $tree->findvalue('//title')) =~ s/^\s+//;
print $title . "\n";

তারপরে আপনি এই স্ক্রিপ্টটি এভাবে চালাতে পারেন:

$ ./title_getter.pl http://www.jake8us.org/~sam/multi-line.html
this is a \n title 

1
ঝরঝরে সমাধান! :)
coffeMug

3
নিয়মিত এক্সপ্রেশন সহ HTML পার্সিং এত সহজ নয়। "<TITLE>", "<শিরোনাম lang = en>", "<শিরোনাম \ n>" হিসাবে লেখা ট্যাগগুলি আপনার অভিব্যক্তির সাথে মিলবে না। এমনকি আরও বড় সমস্যা, "<শিরোনাম> \ নুপস \ n </title>" হবে না।
manatwork

4
Regex ব্যবহার এইচটিএমএল বিশ্লেষণ করার প্রয়াস উপর frowned হতে থাকে এখানে বৃত্তাকার।
ব্যবহারকারীর 3490

1
@ এসএমএল, <title>Unix\nLinux</title>বোঝানো হয়েছে Unix Linux, নয় UnixLinux
স্টাফেন চেজেলাস

1
+1 রুবি + নোকোগির জন্য। আমি এটি সমস্ত ধরণের ওয়েব স্ক্র্যাপিংয়ের জন্য ব্যবহার করেছি, এটি আশ্চর্যজনক!
রব

7

এইচটিএমএল পার্স করার জন্য সরল রেজেেক্স ব্যবহার করা নিষ্পাপ। উদাহরণস্বরূপ নিউলাইনগুলি সহ এবং ফাইলটিতে বর্ণিত বিশেষ অক্ষর এনকোডিং উপেক্ষা করে। সঠিক কাজটি করুন এবং অন্যান্য উত্তরে উল্লিখিত অন্য কোনও আসল পার্সার ব্যবহার করে পৃষ্ঠাটি সত্যই পার্স করুন বা নীচের একটি লাইনার ব্যবহার করুন:

python -c "import bs4, urllib2; print bs4.BeautifulSoup(urllib2.urlopen('http://www.crummy.com/software/BeautifulSoup/bs4/doc/')).title.text"

(উপরের একটি ইউনিকোড অক্ষর অন্তর্ভুক্ত)

বিউটিউসসপ হ'ল প্রচুর ভুল এইচটিএমএল (উদাহরণস্বরূপ ক্লোজিং ট্যাগগুলি নিখোঁজ করা) হ্যান্ডেল করে, এটি সম্পূর্ণ সরলিক পুনর্নির্মাণকে ছুঁড়ে ফেলবে। আপনি এটি ব্যবহার করে এটি একটি স্ট্যান্ডার্ড পাইথনে ইনস্টল করতে পারেন:

pip install beautifulsoup4

বা আপনার যদি না থাকে তবে pipসাথে

easy_install beautifulsoup4

কিছু অপারেটিং সিস্টেম যেমন ডেবিয়ান / উবুন্টুতেও এটি প্যাকেজড ( python-bs4ডেবিয়ান / উবুন্টুতে প্যাকেজ) রয়েছে।


2
bs4পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে নেই। আপনাকে এটি ইনস্টল করতে হবে easy_install beautfulsoup4(না easyinstall bs4) ব্যবহার করে ।
অ্যান্থন

@Anthon আপনার তথ্য অন্তর্ভুক্ত
Zelda

5

হতে পারে এটি "প্রতারণা" তবে একটি বিকল্প হ'ল পিপ, একটি কমান্ড লাইন এইচটিএমএল পার্সার

এটি করার দুটি উপায় এখানে রয়েছে:

বৈশিষ্ট্য metaসহ ক্ষেত্রটি ব্যবহার করাproperty="og:title

$ wget -q 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -O - | \
> pup 'meta[property=og:title] attr{content}'
Why Are Bad Words Bad?

এবং অন্য titleউপায়টি সরাসরি ক্ষেত্রটি ব্যবহার করে (এবং তারপরে - YouTubeস্ট্রিংটি শেষের দিকে বন্ধ করে দেওয়া )।

$ wget -q 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -O - | \
> pup 'title text{}' | sed 's/ - YouTube$//'
Why Are Bad Words Bad?

চরিত্র সত্তা এড়ানোর জন্য, ব্যবহারকারীরা পুতুলের --plainবিকল্পটি ব্যবহার করতে চাইতে পারেন ।
শিখর

3

lynxএই কৌশলটি ব্যবহার করে এটি সম্ভব বলে মনে হচ্ছে ( zsh, bashসিনট্যাক্স):

lynx -cfg=<(printf '%s\n' 'PRINTER:P:printf "%0s\\n" "$LYNX_PRINT_TITLE">&3:TRUE'
  ) lynx 3>&1 > /dev/null -nopause -noprint -accept_all_cookies -cmd_script <(
    printf '%s\n' "key p" "key Select key" "key ^J" exit
  ) 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc'

যেহেতু এটি একটি বাস্তব জীবনের ওয়েব ব্রাউজার, এটি আমার অন্যান্য উত্তরে আমি যে সীমাবদ্ধতাগুলি উল্লেখ করেছি তার অনেকগুলিই ভোগ করে না ।

এখানে, আমরা এমন তথ্য ব্যবহার করছি যা পৃষ্ঠাটি মুদ্রণের সময় বর্তমান পৃষ্ঠার শিরোনামে পরিবেশের পরিবর্তনশীল lynxসেট করে $LYNX_PRINT_TITLE

উপরে, আমরা একটি কনফিগারেশন ফাইল দিচ্ছি (পাইপ হিসাবে) যা একটি লিঙ্ককে "প্রিন্টার" সংজ্ঞায়িত করে Pযা কেবল সেই পরিবর্তনশীলের সামগ্রীটিকে ফাইল বর্ণনাকারীর আউটপুট করে দেয় 3(সেই ফাইল বিবরণকারীকে স্টাডআউটে পুনর্নির্দেশ করা lynxহয় 3>&1যখন লিংক্স স্টাডআউট নিজেই পুনঃনির্দেশিত হয়) to / dev / null)।

তারপরে আমরা lynxস্ক্রিপ্টিং সুবিধাটি ব্যবহারকারীর টিপুন p, এবং End(ওরফে নির্বাচন করুন), এবং Enter( ^J) অনুকরণ করতে ব্যবহার করি ।

-accept_all_cookies অন্যথায় লিঙ্ক প্রতিটি কুকির জন্য নিশ্চিতকরণের জন্য ব্যবহারকারীকে জিজ্ঞাসা করবে।


3

সহজ উপায়:

curl -s example.com | grep -o "<title>[^<]*" | tail -c+8

কয়েকটি বিকল্প:

curl -s example.com | grep -o "<title>[^<]*" | cut -d'>' -f2-
wget -qO- example.com | grep -o "<title>[^<]*" | sed -e 's/<[^>]*>//g'

1
এগুলিই কেবল আমার জন্য কাজ করেছিল!
আহমদ আওইস

1

লিনেক্স এবং এলওয়াইএনএক্সএপিআরআইএনপিটিএল ব্যবহার করার জন্য আমি স্টাফেন চেজেলাসের ধারণাটি পছন্দ করেছি, তবে উবুন্টু 14.04.5 এর অধীনে সেই স্ক্রিপ্টটি আমার পক্ষে কাজ করে নি।

লিনাক্স ব্যবহার করে এবং প্রাক-কনফিগার করা ফাইলগুলি আগে থেকে ব্যবহার করে আমি এর একটি সরলীকৃত সংস্করণ তৈরি করেছি।

নিম্নলিখিত রেখাটি /etc/lynx-cur/lynx.cfg এ যুক্ত করুন (বা যেখানে আপনার lynx.cfg থাকুক না কেন):

PRINTER:P:printenv LYNX_PRINT_TITLE>/home/account/title.txt:TRUE:1000

এই লাইনটি "/home/account/title.txt" - এ মুদ্রণের সময় শিরোনাম সংরক্ষণের নির্দেশ দেয় - আপনি যে কোনও ফাইলের নাম পছন্দ করতে পারেন। আপনি খুব বড় পৃষ্ঠাগুলির জন্য অনুরোধ করেছেন, উপরের মানটি "1000" থেকে আপনার প্রতি পৃষ্ঠায় যে কোনও সংখ্যক লাইন বাড়িয়ে তুলুন, অন্যথায় লিনেক্স অতিরিক্ত প্রম্পট তৈরি করবে "খুব বড় সংখ্যক পৃষ্ঠাগুলিযুক্ত ডকুমেন্ট মুদ্রণ করার সময়"।

তারপরে নিম্নলিখিত বিষয়বস্তুগুলির সাথে /home/account/lynx-script.txt ফাইলটি তৈরি করুন:

key p
key Select key
key ^J
exit

তারপরে নিম্নলিখিত কমান্ড-লাইন বিকল্পগুলি ব্যবহার করে লিংক চালান:

lynx -term=vt100 -display_charset=utf-8 -nopause -noprint -accept_all_cookies -cmd_script=/home/account/lynx-script.txt "http://www.youtube.com/watch?v=Dd7dQh8u4Hc" >/dev/nul

এই কমান্ডটি শেষ করার পরে /home/account/title.txt ফাইলটি আপনার পৃষ্ঠার শিরোনাম দিয়ে তৈরি করা হবে।

দীর্ঘ গল্প সংক্ষিপ্ত, এখানে একটি পিএইচপি ফাংশন যা প্রদত্ত URL এর উপর ভিত্তি করে কোনও পৃষ্ঠা শিরোনাম প্রদান করে, বা ত্রুটির ক্ষেত্রে মিথ্যা false

function GetUrlTitle($url)
{
  $title_file_name = "/home/account/title.txt";
  if (file_exists($title_file_name)) unlink($title_file_name); // delete the file if exists
  $cmd = '/usr/bin/lynx -cfg=/etc/lynx-cur/lynx.cfg -term=vt100 -display_charset=utf-8 -nopause -noprint -accept_all_cookies -cmd_script=/home/account/lynx-script.txt "'.$url.'"';
  exec($cmd, $output, $retval);
  if (file_exists($title_file_name))
  {
    $title = file_get_contents($title_file_name);
    unlink($title_file_name); // delete the file after reading
    return $title;
  } else
  {
    return false;
  }
}

print GetUrlTitle("http://www.youtube.com/watch?v=Dd7dQh8u4Hc");

0

নোকোগিরি ব্যবহার করে, ট্যাগের অভ্যন্তরীণ পাঠ্য এক্সট্র্যাক্ট করতে কেউ একটি সাধারণ সিএসএস-ভিত্তিক ক্যোয়ারী ব্যবহার করতে পারেন:

 $ nokogiri -e 'puts $_.at_css("title").content'
 Why Are Bad Words Bad? - YouTube

একইভাবে, ট্যাগের "বিষয়বস্তু" বৈশিষ্ট্যের মানটি বের করতে:

$ nokogiri -e 'puts $_.at_css("meta[name=title]").attr("content")'
Why Are Bad Words Bad?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.