कमांड लाइन का उपयोग करके मुझे वेबसाइटों का शीर्षक कैसे मिलेगा?


50

मैं एक कमांड लाइन प्रोग्राम चाहता हूं जो एक वेबसाइट के शीर्षक को प्रिंट करता है। उदाहरण के लिए:

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

देना चाहिये:

Why Are Bad Words Bad? 

आप इसे url देते हैं और यह शीर्षक को प्रिंट करता है।


2
जब मैं उस शीर्षक को डाउनलोड करता हूं तो मुझे यह मिलता है: "बुरे शब्द बुरे क्यों होते हैं? - Youtube", क्या आप चाहते हैं कि "- Youtube" भी काट दिया जाए?
स्लम

जवाबों:


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

आप इसे GNU में पाइप कर सकते 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'

कुछ सीमाओं को इंगित करने के लिए:

पोर्टेबिलिटी

HTTP क्वेरीज़ करने के लिए कोई मानक / पोर्टेबल कमांड नहीं है। कुछ दशक पहले, मैंने lynx -sourceयहाँ के बजाय सिफारिश की होगी । लेकिन आजकल, wgetअधिक पोर्टेबल है क्योंकि यह अधिकांश जीएनयू सिस्टम (अधिकांश लिनक्स-आधारित डेस्कटॉप / लैपटॉप ऑपरेटिंग सिस्टम सहित) पर डिफ़ॉल्ट रूप से पाया जा सकता है। अन्य काफी हद तक पोर्टेबल्स में वह GETकमांड शामिल है जो perlअक्सर काम करने वाली लिब्वेन के साथ आती है lynx -source, और कुछ हद तक curl। अन्य आम लोगों में शामिल हैं links -source, elinks -source, w3m -dump_source, lftp -c cat...

HTTP प्रोटोकॉल और रीडायरेक्शन हैंडलिंग

wgetहो सकता है कि उदाहरण के लिए वही पृष्ठ न मिले जो firefoxप्रदर्शित होगा। इसका कारण यह है कि HTTP सर्वर क्लाइंट द्वारा भेजे गए अनुरोध में दी गई जानकारी के आधार पर एक अलग पेज भेजने का विकल्प चुन सकते हैं।

Wget / w3m / GET द्वारा भेजा गया अनुरोध ... फ़ायरफ़ॉक्स द्वारा भेजे गए एक से अलग होने वाला है। यदि यह समस्या है, तो आप 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आपके सिस्टम पर GNU उपलब्ध है:

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

इस तरह, awk पहले के बाद पढ़ना बंद कर देता है </title, और बाहर निकलने से, wgetडाउनलोड करना बंद कर देता है।

HTML की पार्सिंग

यहां, wgetपेज को डाउनलोड करने के साथ ही उसे लिखते हैं। इसी समय, perl, इसके उत्पादन (slurps -0777 -n) स्मृति में पूरे और फिर HTML कोड है की पहली घटनाओं के बीच पाया जाता है प्रिंट <title...>और </title

यह उन अधिकांश HTML पृष्ठों के लिए काम करेगा जिनके पास <title>टैग है, लेकिन ऐसे मामले हैं जहां यह काम नहीं करेगा।

इसके विपरीत CoffeeMug का समाधान HTML पेज को XML के रूप में पार्स करेगा और इसके लिए संबंधित मान लौटाएगा titleयदि पृष्ठ वैध XML होने की गारंटी है तो यह अधिक सही है । हालाँकि, HTML को वैध XML होने की आवश्यकता नहीं है (भाषा के पुराने संस्करण नहीं थे), और क्योंकि अधिकांश ब्राउज़र वहाँ उदार हैं और गलत HTML कोड को स्वीकार कर लेंगे, वहाँ भी बहुत से गलत HTML कोड हैं।

मेरे समाधान और कॉफ़ीमूग दोनों विभिन्न प्रकार के कोने के मामलों में विफल होंगे, कभी-कभी समान, कभी-कभी नहीं।

उदाहरण के लिए, मेरा विफल रहेगा:

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

या:

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

जबकि उसकी असफलता होगी:

<TITLE>foo</TITLE>

(मान्य HTML, xml नहीं) या:

या:

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

(फिर से, वैध html, लापता <![CDATA[हिस्से इसे वैध XML बनाने के लिए)।

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

(गलत HTML, लेकिन अभी भी वहां पाया गया और अधिकांश ब्राउज़रों द्वारा समर्थित है)

टैग के अंदर कोड की व्याख्या।

वह समाधान कच्चे पाठ को बीच <title>- बीच में आउटपुट करता है </title>। आम तौर पर, वहां कोई HTML टैग नहीं होना चाहिए, संभवतः टिप्पणियां हो सकती हैं (हालांकि फ़ायरफ़ॉक्स जैसे कुछ ब्राउज़रों द्वारा संभाला नहीं जाता है ) इतनी संभावना नहीं है। अभी भी कुछ 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

लेकिन एक वेब क्लाइंट भी शीर्षक को प्रदर्शित करते समय उस कोड पर अधिक परिवर्तन करने के लिए होता है (जैसे कुछ रिक्तता को संघनित करता है, अग्रणी और अनुगामी को हटा दें)। हालाँकि इसकी संभावना नहीं है कि इसके लिए कोई आवश्यकता होगी। इसलिए, अन्य मामलों की तरह, यह आप पर निर्भर है कि क्या यह प्रयास के लायक है।

अक्षरों का समूह

UTF-8 से पहले, iso8859-1 गैर-ASCII वर्णों के लिए वेब पर पसंदीदा चारसेट हुआ करता था, हालांकि कड़ाई से बोलते हुए उन्हें लिखा जाना था &eacute;। HTTP और HTML भाषा के अधिक हाल के संस्करणों ने HTTP हेडर या HTML हेडर में सेट कैरेक्टर को निर्दिष्ट करने की संभावना को जोड़ा है, और एक क्लाइंट इसे स्वीकार करने वाले वर्णों को निर्दिष्ट कर सकता है। UTF-8 आजकल डिफ़ॉल्ट चारसेट होता है।

तो, इसका मतलब यह है कि वहाँ, आप के éरूप में लिखा होगा &eacute;, जैसे &#233;, UTF-8 é, (0xc3 0xa9), iso-8859-1 (0xe9) के रूप में, 2 आखिरी वाले के लिए, कभी-कभी चारसेट पर जानकारी। HTTP हेडर या HTML हेडर में (विभिन्न स्वरूपों में), कभी-कभी नहीं।

wget केवल कच्ची बाइट्स मिलती है, यह उनके अर्थ के बारे में पात्रों के रूप में परवाह नहीं करता है, और यह वेब सर्वर को पसंदीदा चार्टसेट के बारे में नहीं बताता है।

recode html..आपके सिस्टम पर उपयोग किए गए वर्ण सेट के लिए &eacute;या &#233;बाइट्स के उचित अनुक्रम में बदलने का ध्यान रखेगा , लेकिन बाकी के लिए, यह मुश्किल है।

यदि आपका सिस्टम charset utf-8 है, तो संभावना है कि यह अधिकांश समय ठीक होने वाला है क्योंकि आजकल डिफ़ॉल्ट charset का उपयोग किया जाता है।

$ 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

वह éऊपर UTF-8 था é

लेकिन अगर आप अन्य चार्ट के लिए कवर करना चाहते हैं, तो एक बार फिर, इसका ध्यान रखना होगा।

यह भी ध्यान दिया जाना चाहिए कि यह समाधान UTF-16 या UTF-32 एन्कोडेड पृष्ठों के लिए बिल्कुल भी काम नहीं करेगा।

सारांश में

आदर्श रूप से, आपको यहां क्या चाहिए, आपको जानकारी देने के लिए एक वास्तविक वेब ब्राउज़र है। यही है, आपको उचित मापदंडों के साथ HTTP अनुरोध करने के लिए कुछ की आवश्यकता है, HTTP प्रतिक्रिया को सही ढंग से रोकें, ब्राउज़र के रूप में HTML कोड की पूरी तरह से व्याख्या करें और शीर्षक वापस करें।

जैसा कि मुझे नहीं लगता कि मुझे पता है कि ब्राउज़रों के साथ कमांड लाइन पर किया जा सकता है (हालांकि अब इस चाल के साथ देखेंlynx ), आपको हेयूरिस्टिक्स और सन्निकटन का सहारा लेना होगा, और ऊपर वाला किसी भी के रूप में अच्छा है।

उदाहरण के लिए, आप सभी मामलों को कवर करने के लिए सुरक्षा, प्रदर्शन पर भी विचार कर सकते हैं ... उदाहरण के लिए, एक वेब पेज जिसमें 3 पार्टी साइट से कुछ जावास्क्रिप्ट खींची गई है जो शीर्षक सेट करती है या किसी अन्य पृष्ठ पर पुनर्निर्देशित करती है ओनोड हुक), आपको अपने डोम और जावास्क्रिप्ट इंजनों के साथ एक वास्तविक जीवन ब्राउज़र को लागू करना पड़ सकता है जिसमें एक ही HTML पृष्ठ के लिए सैकड़ों प्रश्न करने पड़ सकते हैं, जिनमें से कुछ कमजोरियों का फायदा उठाने की कोशिश कर रहे हैं ...

HTML को पार्स करने के लिए regexps का उपयोग करते समय अक्सर इस पर ध्यान दिया जाता है, यहां एक विशिष्ट मामला है जहां यह कार्य (IMO) के लिए पर्याप्त है।


क्या यह पृष्ठों से चित्र भी डाउनलोड करता है? यह भी जंक html फ़ाइलों को पीछे छोड़ देगा?
उफोगुय

2
आप संभवतया शीर्षक के पहले उदाहरण में शीर्षक को समाप्त करना चाहते <हैं क्योंकि शीर्षकों को अंतिम टैग की गारंटी नहीं है और किसी भी अन्य टैग को इसकी समाप्ति के लिए मजबूर करना चाहिए। तुम भी नई लाइनों पट्टी करना चाहते हो सकता है।
ब्रायन निकल

1
HTML को पार्स करने के लिए नियमित अभिव्यक्तियों का उपयोग करने की अनुशंसा नहीं की जाती है। कभी। इस मामले में भी नहीं। यह एक बुरी आदत है। इसके बजाय एक असली पार्सर का उपयोग करें। इस बारे में एक प्रसिद्ध हास्यजनक स्टाकेवरफ्लो उत्तर है ...
रॉबिन ग्रीन

4
@RobinGreen यह पोस्ट एक नियमित भाषा को पार्स करने के लिए रेगेक्स का उपयोग करने के बारे में थी। कैविट्स हैं, लेकिन यह एक समस्या है जो आसानी से एक नियमित भाषा में कम हो जाती है। मैं HTML को पार्स करने के लिए रेगेक्स का उपयोग करने की सलाह देता हूं। कभी कभी। इस मामले में।
ब्रायन निकल

2
और लगभग हर चीज के लिए काम करने वाले नियमित भावों की संख्या लगभग 0. है
रोबिन ग्रीन

27

आप निम्नानुसार hxselect( HTML-XML-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:।

Input is not well-formed. (Maybe try normalize?)संदेश से बचने के लिए STDERR पुनर्निर्देशन है ।

"- YouTube" से छुटकारा पाने के लिए, उपरोक्त कमांड के आउटपुट को पाइप करें awk '{print substr($0, 0, length($0)-10)}'


"hxselect" does'nt डिफ़ॉल्ट रूप से Ubuntu पर स्थापित किया गया लगता है। मैं इसे अपने मौजूदा रिपॉजिटरी में भी नहीं खोज पा रहा हूं। इसे कैसे स्थापित किया जा सकता है?
उफोगुय

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

मुझे Ubuntu 12.10 पर यह त्रुटि मिली "इनपुट अच्छी तरह से नहीं बना है। (हो सकता है कि सामान्य करने का प्रयास करें?)"
slm

1
मुझे पता नहीं है कि संदेश के साथ क्या करना है। आउटपुट को सामान्य करने के बारे में। ऐसा कोई स्विच ऑन नहीं hxselect
slm

1
मैक ओएस एक्स लोगों के लिए Homebrew उस में hxselect के साथ एक सूत्र है। के साथ स्थापित करें brew install html-xml-utils
सुकिमा

18

आप भी कर सकते हैं curlऔर grepयह करने के लिए। आपको पीसीआरई (पर्ल कम्पेटिबल रेगुलर एक्सप्रेशंस) के उपयोग 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+) होता है। फिर इसे बाहर निकाल दिया जाता है।

एक वास्तविक HTML / XML पार्सर - रूबी का उपयोग कर

कुछ बिंदु पर रेगेक्स इस प्रकार की समस्या को हल करने में विफल हो जाएगा। यदि ऐसा होता है, तो आप एक वास्तविक HTML / XML पार्सर का उपयोग करना चाहते हैं। ऐसा ही एक पार्सर है नोकोगिरी । यह माणिक के रूप में रूबी में उपलब्ध है और इसका उपयोग इस तरह किया जा सकता है:

$ 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

उपरोक्त curlHTML ( Nokogiri::HTML) के माध्यम से आने वाले डेटा को पार्स कर रहा है । विधि xpathफिर HTML में नोड्स (टैग) की तलाश करती है जो कि पत्ती नोड्स हैं, ( //) नाम के साथ title। प्रत्येक पाया के लिए हम इसकी सामग्री ( e.content) वापस करना चाहते हैं । putsफिर उन्हें बाहर प्रिंट करता है।

एक वास्तविक HTML / XML पार्सर - पर्ल का उपयोग कर

आप पर्ल और HTML :: TreeBuilder :: XPath मॉड्यूल के साथ भी कुछ ऐसा ही कर सकते हैं ।

$ 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>", "<title \ n>" के रूप में लिखा गया टैग आपकी अभिव्यक्ति से मेल नहीं खाएगा। इससे भी बड़ी समस्या, न तो "<शीर्षक> \ noops \ n </ शीर्षक>" होगा।
मैनेटवर्क

4
Regex का उपयोग करके html को पार्स करने का प्रयास यहां दौर पर फेंका जाता है।
user3490

1
@ एसएलएम, <title>Unix\nLinux</title>का मतलब है Unix Linux, नहीं UnixLinux
स्टीफन चेज़लस

1
रूबी + नोकोगिरी के लिए +1। मैंने इसे सभी प्रकार के वेब स्क्रैपिंग के लिए उपयोग किया है, यह आश्चर्यजनक है!
रोब

7

HTML को पार्स करने के लिए सरल रीगेक्स का उपयोग करना अनुभवहीन है। उदाहरण के लिए, newlines और फ़ाइल में निर्दिष्ट विशेष वर्ण एन्कोडिंग की अनदेखी। सही काम करें और अन्य उत्तर में वर्णित किसी भी वास्तविक पार्सर का उपयोग करके पृष्ठ को पार्स करें या निम्नलिखित एक लाइनर का उपयोग करें:

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

(ऊपर एक यूनिकोड वर्ण शामिल है)।

BeautifulSoup बहुत गलत HTML (जैसे लापता समापन टैग) को संभालता है, जो पूरी तरह से सरलीकृत रीजनिंग को फेंक देगा। आप इसका उपयोग करके मानक अजगर में स्थापित कर सकते हैं:

pip install beautifulsoup4

या यदि आपके पास नहीं है pip, तो

easy_install beautifulsoup4

कुछ ऑपरेटिंग सिस्टम जैसे डेबियन / उबंटू ने भी इसे पैक किया है ( python-bs4डेबियन / उबंटू पर पैकेज)।


2
bs4अजगर मानक पुस्तकालय में नहीं है। आपको इसे easy_install beautfulsoup4(नहीं easyinstall bs4) का उपयोग करके इंस्टॉल करना होगा ।
एंथन

@ एंथन ने आपकी जानकारी को शामिल किया
ज़ेल्डा

5

शायद यह "धोखा" है, लेकिन एक विकल्प पिल्ला है, एक कमांड लाइन HTML पार्सर

इसे करने के दो तरीके हैं:

विशेषता के 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

ऊपर, हम एक विन्यास फाइल दे रहे हैं (एक पाइप के रूप में) जो कि एक lynx "प्रिंटर" को परिभाषित करता है, जिसे कहा जाता है Pकि बस उस वैरिएबल की सामग्री को डिस्क्रिप्टर फाइल करने के लिए आउटपुट करता है 3(उस फाइल डिस्क्रिप्टर को lynx'sdout' पर रीडायरेक्ट किया जाता है, 3>&1जबकि lynx stdout को रीडायरेक्ट किया जाता है। to / देव / नल)।

तब हम lynxउपयोगकर्ता को दबाने के लिए स्क्रिप्टिंग सुविधा का उपयोग करते हैं p, और End(aka select), और Enter( ^J)।

-accept_all_cookies अन्यथा lynx उपयोगकर्ता को हर कुकी के लिए पुष्टि के लिए पूछेगा।


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

मुझे लिंक्स और LYNX_PRINT_TITLE का उपयोग करने के लिए स्टीफन चेज़लस का विचार पसंद आया, लेकिन वह स्क्रिप्ट मेरे लिए Ubuntu 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 आपके पेज के शीर्षक के साथ बनाई जाएगी।

लंबी कहानी छोटी, यहां एक PHP फ़ंक्शन है जो दिए गए URL के आधार पर एक पृष्ठ शीर्षक देता है, या त्रुटि के मामले में गलत है।

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?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.