ฉันจะได้รับชื่อเว็บไซต์โดยใช้บรรทัดคำสั่งได้อย่างไร


50

ฉันต้องการโปรแกรมบรรทัดคำสั่งที่พิมพ์ชื่อของเว็บไซต์ ตัวอย่างเช่น:

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

ควรให้:

Why Are Bad Words Bad? 

คุณให้มัน URL และมันจะพิมพ์ชื่อ


2
เมื่อฉันดาวน์โหลดชื่อเรื่องที่ฉันได้รับ: "ทำไมคำไม่ดีไม่ดี - Youtube" คุณต้องการให้ตัด "- Youtube" ด้วยหรือไม่
slm

คำตอบ:


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สามารถพกพาได้มากกว่าเนื่องจากระบบ GNU ส่วนใหญ่ (รวมถึงระบบปฏิบัติการเดสก์ท็อป / แล็ปท็อปส่วนใหญ่) อื่น ๆ คนที่พกพาอย่างเป็นธรรมรวมถึงGETคำสั่งที่มาพร้อมกับperl's libwww ที่มักจะมีการติดตั้งและในระดับน้อยlynx -source curlอื่น ๆทั่วไปคน ได้แก่links -source, elinks -source, w3m -dump_source, lftp -c cat...

โปรโตคอล HTTP และการจัดการการเปลี่ยนเส้นทาง

wgetอาจไม่ได้รับหน้าเดียวกันกับที่firefoxแสดงเช่น เหตุผลที่เซิร์ฟเวอร์ HTTP อาจเลือกที่จะส่งหน้าอื่นตามข้อมูลที่ระบุในคำขอที่ส่งโดยลูกค้า

คำขอที่ส่งโดย wget / w3m / GET ... จะแตกต่างจากคำขอที่ส่งโดย firefox หากเป็นปัญหาคุณสามารถแก้ไขwgetพฤติกรรมเพื่อเปลี่ยนวิธีการส่งคำขอด้วยตัวเลือก

สิ่งที่สำคัญที่สุดในที่นี้คือ:

  • AcceptและAccept-language: ที่แจ้งให้เซิร์ฟเวอร์ทราบว่าภาษาใดและชุดอักขระที่ไคลเอ็นต์ต้องการรับการตอบสนองwgetไม่ได้ส่งเป็นค่าเริ่มต้นดังนั้นโดยทั่วไปเซิร์ฟเวอร์จะส่งด้วยการตั้งค่าเริ่มต้น firefoxในอีกด้านหนึ่งมีการกำหนดค่าให้ร้องขอภาษาของคุณ
  • User-Agent: ที่ระบุแอปพลิเคชันไคลเอนต์กับเซิร์ฟเวอร์ บางเว็บไซต์ส่งเนื้อหาที่แตกต่างกันขึ้นอยู่กับลูกค้า ( แต่ที่ส่วนใหญ่สำหรับความแตกต่างระหว่างการตีความภาษาจาวาสคริปต์) และอาจปฏิเสธที่จะให้บริการคุณถ้าคุณกำลังใช้หุ่นยนต์wgetตัวแทนผู้ใช้ประเภทเช่น
  • Cookie: หากคุณเคยเข้าชมเว็บไซต์นี้มาก่อนเบราว์เซอร์ของคุณอาจมีคุกกี้ถาวร wgetจะไม่

wgetจะเป็นไปตามการเปลี่ยนเส้นทางเมื่อพวกเขาจะทำในระดับโปรโตคอล HTTP แต่เพราะมันไม่ได้ดูที่เนื้อหาของหน้าไม่ได้เป็นคนที่ทำโดย JavaScript <meta http-equiv="refresh" content="0; url=http://example.com/">หรือสิ่งที่ต้องการ

ผลการดำเนินงาน / ประสิทธิภาพ

ที่นี่เราได้perlอ่านเนื้อหาทั้งหมดในความทรงจำที่ขี้เกียจก่อนที่จะเริ่มมองหา<title>แท็ก เนื่องจากพบชื่ออยู่ใน<head>ส่วนที่อยู่ในช่วงสองสามไบต์แรกของไฟล์ซึ่งไม่เหมาะสม วิธีการที่ดีกว่าถ้า GNU 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หยุดดาวน์โหลด

การแยกวิเคราะห์ของ HTML

ที่นี่wgetเขียนหน้าเว็บขณะที่ดาวน์โหลด ในเวลาเดียวกันperl, slurps ของเอาท์พุท ( -0777 -n) ทั้งในหน่วยความจำแล้วพิมพ์รหัส HTML ที่พบระหว่างการเกิดขึ้นครั้งแรกและ<title...></title

สิ่งนี้จะใช้ได้กับหน้า HTML ส่วนใหญ่ที่มี<title>แท็ก แต่มีบางกรณีที่ไม่สามารถใช้งานได้

ในทางตรงกันข้ามการแก้ปัญหา coffeeMug ของจะแยกหน้า HTML เป็น XML titleและส่งกลับค่าที่เกี่ยวข้องสำหรับ มันเป็นที่ถูกต้องมากขึ้นถ้าหน้ารับประกันได้ว่าจะ XML อย่างไรก็ตาม HTML ไม่จำเป็นต้องเป็น XML ที่ถูกต้อง (ภาษาที่เก่ากว่านั้นไม่ใช่) และเนื่องจากเบราว์เซอร์ส่วนใหญ่มีความผ่อนปรนและจะยอมรับโค้ด HTML ที่ไม่ถูกต้องจึงมีโค้ด HTML ที่ไม่ถูกต้องจำนวนมาก

ทั้งโซลูชันและcoffeeMug ของฉันจะล้มเหลวสำหรับกรณีมุมที่หลากหลายบางครั้งเหมือนกันบางครั้งก็ไม่

ตัวอย่างเช่นฉันจะล้มเหลวใน:

<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 ใด ๆ ในนั้นอาจมีความคิดเห็น (แม้ว่าเบราว์เซอร์บางตัวจะไม่จัดการเช่น firefoxมาก) อาจยังมีการเข้ารหัส 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

ซึ่งดูแลโดย GNU 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 ที่ใช้จะเป็นที่ต้องการ charset บนเว็บสำหรับอักขระที่ไม่ใช่ 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;เรียงลำดับไบต์ที่เหมาะสมสำหรับชุดอักขระที่ใช้ในระบบของคุณ แต่สำหรับส่วนที่เหลือนั่นเป็นเล่ห์เหลี่ยม

หากชุดอักขระระบบของคุณเป็น utf-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

ที่éดังกล่าวข้างต้นเป็น éUTF-8

แต่ถ้าคุณต้องการที่จะครอบคลุม charsets อื่น ๆ อีกครั้งก็จะต้องได้รับการดูแล

ควรสังเกตว่าโซลูชันนี้จะไม่ทำงานเลยสำหรับเพจที่เข้ารหัส UTF-16 หรือ UTF-32

เพื่อสรุป

สิ่งที่คุณต้องการในที่นี้คือเว็บเบราว์เซอร์ตัวจริงที่ให้ข้อมูลแก่คุณ นั่นคือคุณต้องการบางสิ่งบางอย่างในการทำคำขอ HTTP ด้วยพารามิเตอร์ที่เหมาะสมแทรกการตอบกลับ HTTP อย่างถูกต้องแปลรหัส HTML อย่างที่เบราว์เซอร์ต้องการและส่งคืนหัวเรื่อง

เนื่องจากฉันไม่คิดว่าสามารถทำได้ในบรรทัดคำสั่งกับเบราว์เซอร์ที่ฉันรู้ (แต่ตอนนี้ดูเคล็ดลับนี้ด้วยlynx ) คุณต้องหันมาใช้ฮิวริสติกและการประมาณค่าและเหนือสิ่งใดก็ดี

คุณอาจต้องการคำนึงถึงประสิทธิภาพความปลอดภัย ... ตัวอย่างเช่นเพื่อครอบคลุมทุกกรณี (ตัวอย่างเช่นหน้าเว็บที่มีจาวาสคริปต์บางตัวดึงมาจากเว็บไซต์บุคคลที่สามที่ตั้งชื่อหรือเปลี่ยนเส้นทางไปยังหน้าอื่นใน onload hook) คุณอาจต้องใช้เบราว์เซอร์ในชีวิตจริงด้วยเครื่องมือ dom และ javascript ซึ่งอาจต้องค้นหาหลายร้อยข้อความสำหรับหน้า HTML เดียวซึ่งบางอันพยายามใช้ช่องโหว่ ...

ในขณะที่ใช้ regexps เพื่อแยกวิเคราะห์ HTML มักจะขมวดคิ้วอยู่นี่เป็นกรณีทั่วไปที่ดีพอสำหรับงาน (IMO)


มันดาวน์โหลดภาพจากหน้าเว็บด้วยหรือไม่ มันจะทิ้งไฟล์ html hunk ไว้เบื้องหลังหรือไม่?
Ufoguy

2
คุณอาจต้องการยุติชื่อที่อินสแตนซ์แรก<เนื่องจากไม่รับประกันว่าจะมีแท็กปิดท้ายและแท็กอื่น ๆ ควรบังคับให้ยกเลิก คุณอาจต้องการตัดบรรทัดใหม่
Brian Nickel

1
ไม่แนะนำให้ใช้นิพจน์ทั่วไปในการแยกวิเคราะห์ HTML เคย ไม่แม้แต่ในกรณีนี้ มันเป็นนิสัยที่ไม่ดี ใช้ parser จริงแทน มีชื่อเสียงอารมณ์ขันคำตอบ Stackoverflow เกี่ยวกับเรื่องนี้คือ ...
โรบินสีเขียว

4
@RobinGreen โพสต์นั้นเกี่ยวกับการใช้ regex เพื่อแยกภาษาที่ไม่ปกติ มีข้อแม้ แต่นี่เป็นปัญหาที่ลดลงอย่างง่ายดายเป็นภาษาปกติ ฉันแนะนำให้ใช้ regex เพื่อแยกวิเคราะห์ HTML บางครั้ง ในกรณีนี้.
Brian Nickel

2
และจำนวนของนิพจน์ทั่วไปที่ทำงานกับเกือบทุกอย่างคือประมาณ 0
Robin Green

27

คุณสามารถลองhxselect(จากHTML-XML-Utils ) ด้วยwgetดังนี้:

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

คุณสามารถติดตั้งhxselectใน distros Debian
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" ดูเหมือนจะไม่ได้รับการติดตั้งบน Ubuntu โดยค่าเริ่มต้น ฉันไม่สามารถพบมันได้ในที่เก็บที่มีอยู่ของฉัน ฉันจะติดตั้งได้อย่างไร
Ufoguy

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

ฉันได้รับข้อผิดพลาดนี้บน Ubuntu 12.10 "การป้อนข้อมูลไม่ได้อยู่ในรูปแบบที่ถูกต้อง (อาจลองใช้มาตรฐาน)"
slm

1
ฉันไม่พบสิ่งที่จะทำกับ msg เกี่ยวกับ normalizing เอาท์พุท hxselectไม่มีสวิทช์ดังกล่าวใน
slm

1
สำหรับ Mac OS X คนHomebrewมีสูตรที่มี hxselect อยู่ในนั้น brew install html-xml-utilsติดตั้งด้วย
Sukima

18

คุณยังสามารถใช้curlและgrepเพื่อทำสิ่งนี้ คุณจะต้องขอความช่วยเหลือในการใช้PCRE (Perl Compatible Regular Expressions)ใน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 = โหมด PCRE

รูปแบบไปที่grep:

  • (?<=<title>) = ค้นหาสตริงที่ขึ้นต้นด้วยสิ่งนี้ทางด้านซ้ายของสตริง
  • (?=</title>) = ค้นหาสตริงที่ลงท้ายด้วยสิ่งนี้ทางด้านขวาของมัน
  • (.*)= <title>..</title>ทุกสิ่งในระหว่าง

สถานการณ์ที่ซับซ้อนมากขึ้น

หาก<title>...</titie>ครอบคลุมหลายบรรทัดแล้วด้านบนจะไม่พบ คุณสามารถบรรเทาสถานการณ์นี้โดยใช้trเพื่อลบตัวอักษรคือ\ntr -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 Parser จริง - ใช้ Ruby

ณ จุดหนึ่ง regex จะล้มเหลวในการแก้ปัญหาประเภทนี้ หากเป็นเช่นนั้นคุณอาจต้องการใช้เครื่องมือแยกวิเคราะห์ HTML / XML จริง หนึ่งแยกวิเคราะห์ดังกล่าวเป็นNokogiri มันมีอยู่ใน Ruby as a Gem และสามารถใช้ได้ดังนี้:

$ 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

ด้านบนคือการแยกวิเคราะห์ข้อมูลที่มาทางcurlas HTML ( Nokogiri::HTML) วิธีการxpathนั้นจะมองหาโหนด (แท็ก) ใน HTML ที่มีโหนดใบ ( //) titleที่มีชื่อ สำหรับการค้นพบแต่ละครั้งเราต้องการคืนเนื้อหา ( e.content) putsแล้วพิมพ์พวกเขาออก

ตัวแยกวิเคราะห์ HTML / XML จริงโดยใช้ Perl

คุณยังสามารถทำสิ่งที่คล้ายกับ Perl และโมดูล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>”,“ <title lang = th>”,“ <title \ n>” จะไม่ถูกจับคู่โดยนิพจน์ของคุณ แม้แต่ปัญหาที่ใหญ่กว่าจะไม่มี“ <title> \ noops \ n </title>”
จัดการ

4
ความพยายามที่จะแยกวิเคราะห์ HTML โดยใช้ regex มีแนวโน้มที่จะขมวดคิ้วในรอบที่นี่
user3490

1
@slm, <title>Unix\nLinux</title>หมายถึงจะไม่Unix Linux UnixLinux
Stéphane Chazelas

1
+1 สำหรับ ruby ​​+ nokogiri ฉันใช้มันสำหรับการขูดเว็บทุกชนิดมันวิเศษมาก!
Rob

7

ใช้ regex ง่าย ๆ ในการแยกวิเคราะห์ HTML ไร้เดียงสา เช่นมีการขึ้นบรรทัดใหม่และละเว้นการเข้ารหัสอักขระพิเศษที่ระบุในไฟล์ ทำสิ่งที่ถูกต้องและแยกวิเคราะห์หน้าจริงๆโดยใช้ตัวแยกวิเคราะห์จริงอื่น ๆ ที่กล่าวถึงในคำตอบอื่น ๆ หรือใช้หนึ่งซับต่อไปนี้:

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

(ด้านบนมีอักขระ Unicode)

BeautifulSoup จัดการ HTML ที่ไม่ถูกต้องจำนวนมาก (เช่นแท็กปิดที่ขาดหายไป) เช่นกันซึ่งจะทำให้การ regexing ง่าย คุณสามารถติดตั้งในไพ ธ อนมาตรฐานได้โดยใช้:

pip install beautifulsoup4

หรือถ้าคุณไม่มีpipด้วย

easy_install beautifulsoup4

ระบบปฏิบัติการบางระบบเช่น Debian / Ubuntu ยังมีระบบบรรจุภัณฑ์ ( python-bs4แพ็คเกจบน Debian / Ubuntu)


2
bs4ไม่ได้อยู่ในไลบรารีมาตรฐานของไพ ธ อน คุณต้องติดตั้งโดยใช้easy_install beautfulsoup4(ไม่ใช่easyinstall bs4)
Anthon

@Aththon รวมข้อมูลของคุณแล้ว
Zelda

5

บางทีมันอาจจะเป็น "การโกง" แต่เลือกหนึ่งคือลูกสุนัขเป็นบรรทัดคำสั่ง parser

นี่คือสองวิธีที่จะทำ:

ใช้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 "printer" ที่เรียกPว่าเพียงแค่แสดงผลเนื้อหาของตัวแปรนั้นไปยัง file descriptor 3(ไฟล์ descriptor นั้นถูกเปลี่ยนเส้นทางไปยังlynxstdout ของ3>&1lynx ในขณะที่ lynx stdout นั้นถูกเปลี่ยนเส้นทาง ถึง / dev / null)

จากนั้นเราใช้เครื่องมือการlynxเขียนสคริปต์เพื่อจำลองการกดของผู้ใช้pและEnd(เลือก aka) และ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
เหล่านี้เป็นคนเดียวที่ทำงานสำหรับฉัน!
Ahmad Awais

1

ฉันชอบไอเดียของStéphane Chazelas ที่ใช้ Lynx และ LYNX_PRINT_TITLE แต่สคริปต์นั้นใช้ไม่ได้กับฉันใน Ubuntu 14.04.5

ฉันสร้างเวอร์ชันที่ง่ายขึ้นโดยการใช้งาน Lynx และใช้ไฟล์ที่กำหนดค่าล่วงหน้าไว้ล่วงหน้า

เพิ่มบรรทัดต่อไปนี้ใน /etc/lynx-cur/lynx.cfg (หรือที่ใดก็ตามที่ lynx.cfg ของคุณอยู่):

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

บรรทัดนี้สั่งให้บันทึกหัวเรื่องขณะพิมพ์ไปที่ "/home/account/title.txt" - คุณสามารถเลือกชื่อไฟล์ใดก็ได้ที่คุณต้องการ คุณขอหน้ากระดาษขนาดใหญ่มากเพิ่มค่าข้างต้นจาก "1,000" เป็นจำนวนบรรทัดต่อหน้าใด ๆ ที่คุณต้องการมิฉะนั้น Lynx จะแจ้งให้เพิ่มเติม "เมื่อพิมพ์เอกสารที่มีจำนวนหน้ามาก"

จากนั้นสร้างไฟล์ /home/account/lynx-script.txt ด้วยเนื้อหาต่อไปนี้:

key p
key Select key
key ^J
exit

จากนั้นเรียกใช้ Lynx โดยใช้ตัวเลือกบรรทัดคำสั่งต่อไปนี้:

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 เราสามารถใช้แบบสอบถามที่ใช้ CSS ง่าย ๆ ในการแยกข้อความด้านในของแท็ก:

 $ 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.