ฉันต้องการโปรแกรมบรรทัดคำสั่งที่พิมพ์ชื่อของเว็บไซต์ ตัวอย่างเช่น:
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
เพื่อลบตัวอักษรคือ\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
หากการ<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
ด้านบนคือการแยกวิเคราะห์ข้อมูลที่มาทางcurl
as 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 นั้นถูกเปลี่ยนเส้นทางไปยังlynx
stdout ของ3>&1
lynx ในขณะที่ 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?