wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
आप इसे GNU में पाइप कर सकते recode
हैं अगर इसमें कुछ चीजें हों <
:
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 & 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 वर्णों के लिए वेब पर पसंदीदा चारसेट हुआ करता था, हालांकि कड़ाई से बोलते हुए उन्हें लिखा जाना था é
। HTTP और HTML भाषा के अधिक हाल के संस्करणों ने HTTP हेडर या HTML हेडर में सेट कैरेक्टर को निर्दिष्ट करने की संभावना को जोड़ा है, और एक क्लाइंट इसे स्वीकार करने वाले वर्णों को निर्दिष्ट कर सकता है। UTF-8 आजकल डिफ़ॉल्ट चारसेट होता है।
तो, इसका मतलब यह है कि वहाँ, आप के é
रूप में लिखा होगा é
, जैसे é
, UTF-8 é
, (0xc3 0xa9), iso-8859-1 (0xe9) के रूप में, 2 आखिरी वाले के लिए, कभी-कभी चारसेट पर जानकारी। HTTP हेडर या HTML हेडर में (विभिन्न स्वरूपों में), कभी-कभी नहीं।
wget
केवल कच्ची बाइट्स मिलती है, यह उनके अर्थ के बारे में पात्रों के रूप में परवाह नहीं करता है, और यह वेब सर्वर को पसंदीदा चार्टसेट के बारे में नहीं बताता है।
recode html..
आपके सिस्टम पर उपयोग किए गए वर्ण सेट के लिए é
या é
बाइट्स के उचित अनुक्रम में बदलने का ध्यान रखेगा , लेकिन बाकी के लिए, यह मुश्किल है।
यदि आपका सिस्टम 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'appartement - YouTube
वह é
ऊपर UTF-8 था é
।
लेकिन अगर आप अन्य चार्ट के लिए कवर करना चाहते हैं, तो एक बार फिर, इसका ध्यान रखना होगा।
यह भी ध्यान दिया जाना चाहिए कि यह समाधान UTF-16 या UTF-32 एन्कोडेड पृष्ठों के लिए बिल्कुल भी काम नहीं करेगा।
सारांश में
आदर्श रूप से, आपको यहां क्या चाहिए, आपको जानकारी देने के लिए एक वास्तविक वेब ब्राउज़र है। यही है, आपको उचित मापदंडों के साथ HTTP अनुरोध करने के लिए कुछ की आवश्यकता है, HTTP प्रतिक्रिया को सही ढंग से रोकें, ब्राउज़र के रूप में HTML कोड की पूरी तरह से व्याख्या करें और शीर्षक वापस करें।
जैसा कि मुझे नहीं लगता कि मुझे पता है कि ब्राउज़रों के साथ कमांड लाइन पर किया जा सकता है (हालांकि अब इस चाल के साथ देखेंlynx
), आपको हेयूरिस्टिक्स और सन्निकटन का सहारा लेना होगा, और ऊपर वाला किसी भी के रूप में अच्छा है।
उदाहरण के लिए, आप सभी मामलों को कवर करने के लिए सुरक्षा, प्रदर्शन पर भी विचार कर सकते हैं ... उदाहरण के लिए, एक वेब पेज जिसमें 3 पार्टी साइट से कुछ जावास्क्रिप्ट खींची गई है जो शीर्षक सेट करती है या किसी अन्य पृष्ठ पर पुनर्निर्देशित करती है ओनोड हुक), आपको अपने डोम और जावास्क्रिप्ट इंजनों के साथ एक वास्तविक जीवन ब्राउज़र को लागू करना पड़ सकता है जिसमें एक ही HTML पृष्ठ के लिए सैकड़ों प्रश्न करने पड़ सकते हैं, जिनमें से कुछ कमजोरियों का फायदा उठाने की कोशिश कर रहे हैं ...
HTML को पार्स करने के लिए regexps का उपयोग करते समय अक्सर इस पर ध्यान दिया जाता है, यहां एक विशिष्ट मामला है जहां यह कार्य (IMO) के लिए पर्याप्त है।