ฉันต้องการโปรแกรมบรรทัดคำสั่งที่พิมพ์ชื่อของเว็บไซต์ ตัวอย่างเช่น:
Alan:~ titlefetcher http://www.youtube.com/watch?v=Dd7dQh8u4Hc
ควรให้:
Why Are Bad Words Bad?
คุณให้มัน URL และมันจะพิมพ์ชื่อ
ฉันต้องการโปรแกรมบรรทัดคำสั่งที่พิมพ์ชื่อของเว็บไซต์ ตัวอย่างเช่น:
Alan:~ titlefetcher http://www.youtube.com/watch?v=Dd7dQh8u4Hc
ควรให้:
Why Are Bad Words Bad?
คุณให้มัน URL และมันจะพิมพ์ชื่อ
คำตอบ:
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สามารถพกพาได้มากกว่าเนื่องจากระบบ GNU ส่วนใหญ่ (รวมถึงระบบปฏิบัติการเดสก์ท็อป / แล็ปท็อปส่วนใหญ่) อื่น ๆ คนที่พกพาอย่างเป็นธรรมรวมถึงGETคำสั่งที่มาพร้อมกับperl's libwww ที่มักจะมีการติดตั้งและในระดับน้อยlynx -source curlอื่น ๆทั่วไปคน ได้แก่links -source, elinks -source, w3m -dump_source, lftp -c cat...
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หยุดดาวน์โหลด
ที่นี่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 & 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 éแต่อย่างเคร่งครัดพูดพวกเขาจะต้องเขียนเป็น HTTP รุ่นล่าสุดและภาษา HTML ได้เพิ่มความเป็นไปได้ในการระบุชุดอักขระในส่วนหัว HTTP หรือในส่วนหัว HTML และลูกค้าสามารถระบุชุดอักขระที่ยอมรับได้ UTF-8 มีแนวโน้มที่จะเป็นชุดอักขระเริ่มต้นในปัจจุบัน
ดังนั้นนั่นหมายความว่าคุณจะพบว่ามีéเขียนเป็นé, เป็นé, เป็น UTF-8 é, (0xc3 0xa9), เป็น iso-8859-1 (0xe9), กับ 2 อันสุดท้าย, บางครั้งข้อมูลบนชุดอักขระ ในส่วนหัว HTTP หรือส่วนหัว HTML (ในรูปแบบที่แตกต่างกัน) บางครั้งก็ไม่
wget รับไบต์ที่ดิบเท่านั้นมันไม่สนใจความหมายของมันในฐานะตัวอักษรและไม่ได้บอกเว็บเซิร์ฟเวอร์เกี่ยวกับชุดอักขระที่ต้องการ
recode html..จะระมัดระวังในการแปลงéหรือéเรียงลำดับไบต์ที่เหมาะสมสำหรับชุดอักขระที่ใช้ในระบบของคุณ แต่สำหรับส่วนที่เหลือนั่นเป็นเล่ห์เหลี่ยม
หากชุดอักขระระบบของคุณเป็น 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'appartement - YouTube
ที่éดังกล่าวข้างต้นเป็น éUTF-8
แต่ถ้าคุณต้องการที่จะครอบคลุม charsets อื่น ๆ อีกครั้งก็จะต้องได้รับการดูแล
ควรสังเกตว่าโซลูชันนี้จะไม่ทำงานเลยสำหรับเพจที่เข้ารหัส UTF-16 หรือ UTF-32
สิ่งที่คุณต้องการในที่นี้คือเว็บเบราว์เซอร์ตัวจริงที่ให้ข้อมูลแก่คุณ นั่นคือคุณต้องการบางสิ่งบางอย่างในการทำคำขอ HTTP ด้วยพารามิเตอร์ที่เหมาะสมแทรกการตอบกลับ HTTP อย่างถูกต้องแปลรหัส HTML อย่างที่เบราว์เซอร์ต้องการและส่งคืนหัวเรื่อง
เนื่องจากฉันไม่คิดว่าสามารถทำได้ในบรรทัดคำสั่งกับเบราว์เซอร์ที่ฉันรู้ (แต่ตอนนี้ดูเคล็ดลับนี้ด้วยlynx ) คุณต้องหันมาใช้ฮิวริสติกและการประมาณค่าและเหนือสิ่งใดก็ดี
คุณอาจต้องการคำนึงถึงประสิทธิภาพความปลอดภัย ... ตัวอย่างเช่นเพื่อครอบคลุมทุกกรณี (ตัวอย่างเช่นหน้าเว็บที่มีจาวาสคริปต์บางตัวดึงมาจากเว็บไซต์บุคคลที่สามที่ตั้งชื่อหรือเปลี่ยนเส้นทางไปยังหน้าอื่นใน onload hook) คุณอาจต้องใช้เบราว์เซอร์ในชีวิตจริงด้วยเครื่องมือ dom และ javascript ซึ่งอาจต้องค้นหาหลายร้อยข้อความสำหรับหน้า HTML เดียวซึ่งบางอันพยายามใช้ช่องโหว่ ...
ในขณะที่ใช้ regexps เพื่อแยกวิเคราะห์ HTML มักจะขมวดคิ้วอยู่นี่เป็นกรณีทั่วไปที่ดีพอสำหรับงาน (IMO)
<เนื่องจากไม่รับประกันว่าจะมีแท็กปิดท้ายและแท็กอื่น ๆ ควรบังคับให้ยกเลิก คุณอาจต้องการตัดบรรทัดใหม่
คุณสามารถลอง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)}'ท่อส่งออกของคำสั่งดังกล่าวไปยัง
sudo apt-get install html-xml-utils
hxselectไม่มีสวิทช์ดังกล่าวใน
คุณยังสามารถใช้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 - = ส่งออกไปยัง STDOUTgrepสวิทช์:
-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
หากการ<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+) มันถูกถอดออกแล้ว
ณ จุดหนึ่ง 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แล้วพิมพ์พวกเขาออก
คุณยังสามารถทำสิ่งที่คล้ายกับ 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
<title>Unix\nLinux</title>หมายถึงจะไม่Unix Linux UnixLinux
ใช้ 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)
bs4ไม่ได้อยู่ในไลบรารีมาตรฐานของไพ ธ อน คุณต้องติดตั้งโดยใช้easy_install beautfulsoup4(ไม่ใช่easyinstall bs4)
บางทีมันอาจจะเป็น "การโกง" แต่เลือกหนึ่งคือลูกสุนัขเป็นบรรทัดคำสั่ง 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ตัวเลือกของลูกสุนัข
ดูเหมือนว่าจะเป็นไปได้ด้วยการ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 มิฉะนั้นคมจะถามผู้ใช้สำหรับการยืนยันสำหรับทุกคุกกี้
วิธีง่าย ๆ :
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'
ฉันชอบไอเดียของ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");
ด้วยการใช้ 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?