HTML फ़ाइल से वेबसाइट URL प्राप्त करने के लिए स्क्रिप्ट में grep और कट का उपयोग कैसे करें


21

मैं एक HTML फ़ाइल से URL निकालने के लिए grep और कट का उपयोग करने का प्रयास कर रहा हूं। लिंक इस तरह दिखते हैं:

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

अन्य वेबसाइटों के पास है .net, .govलेकिन मुझे लगता है कि मैं कट ऑफ प्वाइंट को पहले ही बना सकता था >। तो मुझे पता है कि मैं grep का उपयोग कर सकता हूं और किसी भी तरह से http और .com से पहले सब कुछ काट सकता हूं, लेकिन मैं इस पर थोड़ी देर के लिए अटक गया।


मैंने इसे संपादित किया। कुछ के लिए <और a के बीच के स्थान को अनदेखा करें, HTML इसके बिना दिखाई नहीं देगा। उस पकड़ने के लिए धन्यवाद!
eltigre

कोड स्वरूपण का उपयोग करें (पाठ का चयन करें और Ctrl-K दबाएं)। अन्यथा <>यह एक HTML टैग के रूप में देखने के लिए मजबूर करता है।
मुरु

href पैरामीटर के उद्घाटन और समाप्ति उद्धरण से मेल क्यों नहीं खाते? इसके अलावा, मेरा मानना ​​है कि नियमित अभिव्यक्ति html के लिए सबसे उपयुक्त नहीं हैं।
把 留 在 ''

मैं विशेष रूप से grep और इसे करने के लिए कट का उपयोग करके एक कमांड लिखना चाहता हूं। मुझे लगता है कि अन्य तरीके भी हैं, लेकिन मैं उन लोगों के बारे में जानना चाहता था।
एलीट्रे

9
सामान्य रूप से HTML को रेगुलर एक्सप्रेशंस के साथ पार्स करना अच्छा नहीं है, क्योंकि HTML एक नियमित भाषा नहीं है। आप कर सकते हैं गारंटी है कि HTML आप कर रहे हैं पार्स काफी सरल है, और सामान आप निकालने की कोशिश कर रहे पूर्वानुमान है आप कर सकते हैं इसके साथ दूर होने के लिए सक्षम हो। लेकिन कृपया देखें stackoverflow.com/a/1732454/4014959
PM 2Ring

जवाबों:


25

जैसा कि मैंने अपनी टिप्पणी में कहा, आम तौर पर HTML को रेगुलर एक्सप्रेशंस के साथ पार्स करना अच्छा नहीं है, लेकिन यदि आप जिस HTML को पार्स कर रहे हैं वह अच्छी तरह से व्यवहार में है तो आप कभी-कभी इससे दूर हो सकते हैं।

केवल उन URL को प्राप्त करने के लिए जो तत्वों की hrefविशेषता में <a>हैं, मुझे इसे कई चरणों में करना आसान लगता है। आपकी टिप्पणियों से, ऐसा लगता है कि आप केवल शीर्ष स्तर का डोमेन चाहते हैं, पूर्ण URL नहीं। उस मामले में आप कुछ इस तरह का उपयोग कर सकते हैं:

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

जहां source.htmlHTML कोड पार्स करने के लिए फाइल है।

यह कोड उन सभी शीर्ष-स्तरीय URL को प्रिंट करेगा जो प्रत्येक पंक्ति में hrefकिसी भी <a>तत्व की विशेषता के रूप में होते हैं । -iपहले करने का विकल्प grepआदेश सुनिश्चित करने के लिए है कि यह दोनों पर काम करेंगे है <a>और <A>तत्वों। मुझे लगता है कि आप -i2 को भी दे सकते हैंgrep ऊपरी मामले की HREFविशेषताओं को कैप्चर को , OTOH, मैं ऐसे टूटे हुए HTML को अनदेखा करना पसंद करूंगा। :)

की सामग्री को संसाधित करने के लिए 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

मेरा आउटपुट अन्य उदाहरणों से थोड़ा अलग है क्योंकि मुझे ऑस्ट्रेलियाई Google पृष्ठ पर पुनः निर्देशित किया गया है।


धन्यवाद। अब यह वही है जिसकी मुझे तलाश थी। यह इसे करने का सबसे साफ तरीका है।
eltigre

@eltigre: मेरी खुशी! लेकिन कृपया ऊपर दिए गए मेरे टिप्पणी से जुड़ी चेतावनी पर ध्यान दें। :)
PM 2

इस सवाल पर मुझे आसान बिंदुओं की उम्मीद थी ... और आप पहले से ही पूरी तरह से सिर पर कील
ठोकेंगे

धन्यवाद, @MarkKCowan :) FWIW, मैंने मूल रूप से awk का उपयोग करके एक उत्तर लिखना शुरू कर दिया था, लेकिन फिर मैंने फैसला किया कि एक grep- आधारित समाधान उन लोगों के लिए समझना आसान होगा जो awk से परिचित नहीं हैं। और वैसे भी, ऊपर का कोड मेरे awk कोड से छोटा है।
PM 2Ring

2
@mavavilj: क्योंकि ओपी केवल शीर्ष स्तर का डोमेन चाहता था, इसलिए ://हम केवल पहले /या उससे पहले के चार्ट स्वीकार करते हैं "। लेकिन अगर आप पूरा URL देखना चाहते हैं, तो उस कमांड को बदल दें grep -Eo '(http|https)://[^"]+। उस पंक्ति के लिए एक अन्य विकल्प है grep -Eo '(http|https)://[^?"]+'जो क्वेरी विकल्पों को काट देता है। हालाँकि, वह भिन्नता अभी भी उन URL को प्रिंट करेगी जो किसी अन्य URL के भीतर क्वेरी पैरामीटर के रूप में सम्‍मिलित हैं, लेकिन वे एक अलग पंक्ति में मुद्रित होंगे।
बजे PM 2Ring

25

सुनिश्चित नहीं हैं कि आप उपकरणों पर सीमित हैं:

लेकिन रेगेक्स का उल्लेख करने का सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यहां एक उदाहरण है जिसे मैंने एक साथ रखा है:

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
  • grep -E: egrep जैसा ही है
  • grep -o: केवल वही आउटपुट करता है जो ग्रीप्ड किया गया है
  • (http | https): या तो / या है
  • az: सभी लोअर केस है
  • AZ: सभी uper मामला है
  • । : डॉट है
  • \?: है ?
  • * [...] समूह दोहरा रहा है
  • uniq: किसी भी डुप्लिकेट को निकाल देगा

आउटपुट:

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
आईआरआई rexxes! उनमें से एक का उपयोग करें और ओपी को डरा दें! :)
मुरु

2
@muru ... कांप मैं ... मैं क्या कहना है पता नहीं है। क्या वे भी असली हैं !?
jmunsch

4
@jmunsch, uniq बस आसन्न डुप्लिकेट को हटा दें। sort -u?
जोजो

1
यह बहुत अच्छा काम करता है, सबसे अच्छा जवाब !!
Gery

@ जेजाओ पाइपिंग की तुलना में सॉ-यू के लिए तेजी से स्रोत है? बस एक सोचा प्रयोग, आईडी देखना है। लेकिन आप शायद सही हैं, शेल मिडिलवेयर के बारे में।
jmunsch

9

यदि आपका grep पर्ल रेगेक्स का समर्थन करता है:

grep -Po '(?<=href=")[^"]*(?=")'
  • (?<=href=")और विशेषता के लिए लुकअप एक्सप्रेशन (?=")हैं । इसके लिए विकल्प की जरूरत है ।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
...

हमेशा की तरह, इस बात की कोई गारंटी नहीं है कि ये वैध यूआरआई हैं, या आप जिस HTML को पार्स कर रहे हैं वह मान्य होगा।


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

इस समाधान का लाभ यह है कि यह HTML के ठीक से स्वरूपित होने पर निर्भर नहीं करता है


1
+1 के लिए pup,
मार्क के कोवान

आप उन्हें फ़ाइल में भी डाल सकते हैं। pup 'a.classname[href] attr{href}' < tut.html >links.md
अहमद आवा 16

1

मैंने यहां एक समाधान खोजा है जो IMHO है जो कि यहां प्रस्तावित था, की तुलना में बहुत सरल और संभावित रूप से तेज है। मैंने https फ़ाइलों का समर्थन करने के लिए थोड़ा सा समायोजित किया है। लेकिन टीडी? टीआर संस्करण है ...

PS: आप साइट URL को किसी पथ के साथ एक फ़ाइल में बदल सकते हैं और यह उसी तरह काम करेगा।

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 या अन्य स्रोतों की जाँच करने की कोशिश करने की आवश्यकता नहीं है क्योंकि "lynx -dump" किसी दिए गए पृष्ठ से सभी क्लिक करने योग्य लिंक को डिफ़ॉल्ट रूप से निकाल देगा। तो केवल आपको लगता है कि उसके बाद क्या करने की जरूरत है "lynx -dump" के परिणाम को पार्स करने के लिए उसी परिणाम का एक क्लीनर कच्चा संस्करण प्राप्त करने के लिए grep का उपयोग करना है।


लेकिन सवाल यह है कि "HTML फाइल से यूआरएल निकालें [जो दिखता है] जैसे" (उदाहरण), न कि "किसी वेब पेज से यूआरएल निकालें"। यदि आपके उत्तर का उपयोग स्थानीय मशीन पर मौजूद फ़ाइल के विरुद्ध किया जा सकता है, तो बताएं कि कैसे। कृपया टिप्पणियों में प्रतिक्रिया न दें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
जी-मैन का कहना है कि 'मोनिका'

1
आप URL को फ़ाइल नाम से बदल सकते हैं।
asiby

@ जी-मैन, क्यों -1? आपको कोड को स्वयं आज़माना होगा और देखना होगा कि यह स्थानीय फ़ाइलों के लिए भी काम करता है। मैंने उस स्पष्टीकरण को जोड़ दिया है जब यह स्पष्ट नहीं था।
asiby

यह वास्तव में आसान है .. अगर आप xargs के साथ उपयोग कर रहे हैं तो यह जोड़ने लायक है सॉर्ट | डुप्लिकेट लिंक ट्रिम करने के लिए uniq।
स्टुअर्ट एक्सॉन

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एड पाने के लिए और डुप्लिकेट को छोड़ने के लिए एक फिल्टर पर अंत तक निपट सकते हैं।



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