Làm cách nào để có được tiêu đề trang web bằng dòng lệnh?


50

Tôi muốn một chương trình dòng lệnh in tiêu đề của một trang web. Ví dụ:

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

nên cho đi:

Why Are Bad Words Bad? 

Bạn cung cấp cho nó url và nó in ra Tiêu đề.


2
Khi tôi tải xuống tiêu đề đó, tôi nhận được: "Tại sao từ xấu lại xấu? - Youtube", bạn có muốn cắt "- Youtube" không?
slm

Câu trả lời:


44
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'

Bạn có thể chuyển nó sang GNU recodenếu có những thứ như &lt;trong đó:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' |
  recode html..

Để loại bỏ - youtubemột phần:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
 perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)(?: - youtube)?\s*<\/title/si'

Để chỉ ra một số hạn chế:

tính di động

Không có lệnh tiêu chuẩn / di động để thực hiện các truy vấn HTTP. Một vài thập kỷ trước, tôi đã đề nghị lynx -sourcethay thế ở đây. Nhưng ngày nay, wgetnó dễ mang theo hơn vì nó có thể được tìm thấy theo mặc định trên hầu hết các hệ thống GNU (bao gồm hầu hết các hệ điều hành máy tính để bàn / máy tính xách tay dựa trên Linux). Những cái khá di động khác bao gồm GETlệnh đi kèm với perllibwww thường được cài đặt lynx -sourcevà ở mức độ thấp hơn curl. Khác thường những người bao gồm links -source, elinks -source, w3m -dump_source, lftp -c cat...

Giao thức HTTP và xử lý chuyển hướng

wgetcó thể không nhận được cùng một trang như ví dụ firefoxsẽ hiển thị. Lý do là các máy chủ HTTP có thể chọn gửi một trang khác dựa trên thông tin được cung cấp trong yêu cầu được gửi bởi khách.

Yêu cầu được gửi bởi wget / w3m / GET ... sẽ khác với yêu cầu được gửi bởi firefox. Nếu đó là một vấn đề, bạn có thể thay đổi wgethành vi để thay đổi cách gửi yêu cầu mặc dù có tùy chọn.

Những điều quan trọng nhất ở đây về vấn đề này là:

  • AcceptAccept-language: thông báo cho máy chủ biết ngôn ngữ và bảng mã mà khách hàng muốn nhận phản hồi. wgetKhông gửi bất kỳ mặc định nào để máy chủ thường gửi với cài đặt mặc định. firefoxở đầu bên kia có khả năng được cấu hình để yêu cầu ngôn ngữ của bạn.
  • User-Agent: xác định ứng dụng khách đến máy chủ. Một số trang web gửi nội dung khác nhau dựa trên ứng dụng khách (mặc dù điều đó chủ yếu là do sự khác biệt giữa các diễn giải ngôn ngữ javascript) và có thể từ chối phục vụ bạn nếu bạn đang sử dụng tác nhân người dùng giống như robotwget .
  • Cookie: nếu bạn đã truy cập trang web này trước đây, trình duyệt của bạn có thể có cookie vĩnh viễn cho nó. wgetsẽ không.

wgetsẽ tuân theo các chuyển hướng khi chúng được thực hiện ở cấp giao thức HTTP, nhưng vì nó không nhìn vào nội dung của trang, chứ không phải các nội dung được thực hiện bởi javascript hoặc những thứ như thế <meta http-equiv="refresh" content="0; url=http://example.com/">.

Hiệu suất / hiệu quả

Ở đây, vì lười biếng, chúng tôi đã perlđọc toàn bộ nội dung trong bộ nhớ trước khi bắt đầu tìm kiếm <title>thẻ. Cho rằng tiêu đề được tìm thấy trong <head>phần nằm trong một vài byte đầu tiên của tệp, điều đó không tối ưu. Một cách tiếp cận tốt hơn, nếu GNU awkcó sẵn trên hệ thống của bạn có thể là:

wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
  gawk -v IGNORECASE=1 -v RS='</title' 'RT{gsub(/.*<title[^>]*>/,"");print;exit}'

Bằng cách đó, awk dừng đọc sau lần đầu tiên </titlevà bằng cách thoát, khiến wgetdừng tải xuống.

Phân tích cú pháp HTML

Ở đây, wgetviết trang khi nó tải nó. Đồng thời, đưa toàn bộ perlđầu ra ( -0777 -n) của nó vào bộ nhớ và sau đó in mã HTML được tìm thấy giữa các lần xuất hiện đầu tiên của <title...></title.

Điều đó sẽ hoạt động đối với hầu hết các trang HTML có <title>thẻ, nhưng có những trường hợp nó không hoạt động.

Ngược lại , giải pháp của coffeeMug sẽ phân tích trang HTML dưới dạng XML và trả về giá trị tương ứng cho title. Sẽ đúng hơn nếu trang được đảm bảo là XML hợp lệ . Tuy nhiên, HTML không bắt buộc phải là XML hợp lệ (phiên bản cũ hơn của ngôn ngữ là không) và bởi vì hầu hết các trình duyệt ngoài kia đều khoan dung và sẽ chấp nhận mã HTML không chính xác, thậm chí còn có rất nhiều mã HTML không chính xác.

Cả giải pháp của tôi và coffeeMug đều thất bại đối với nhiều trường hợp góc, đôi khi giống nhau, đôi khi không.

Chẳng hạn, tôi sẽ thất bại về:

<html><head foo="<title>"><title>blah</title></head></html>

hoặc là:

<!-- <title>old</title> --><title>new</title>

Trong khi ý chí của anh thất bại về:

<TITLE>foo</TITLE>

(html hợp lệ, không phải xml) hoặc:

hoặc là:

<title>...</title>
...
<script>a='<title>'; b='</title>';</script>

(một lần nữa, hợp lệ html, thiếu <![CDATA[các phần để làm cho nó hợp lệ XML).

<title>foo <<<bar>>> baz</title>

(html không chính xác, nhưng vẫn được tìm thấy ở đó và được hầu hết các trình duyệt hỗ trợ)

giải thích mã bên trong các thẻ.

Giải pháp đó đưa ra văn bản thô giữa <title></title>. Thông thường, không nên có bất kỳ thẻ HTML nào trong đó, có thể có các nhận xét (mặc dù không được xử lý bởi một số trình duyệt như firefox nên rất khó xảy ra). Vẫn có thể có một số mã hóa 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

Được GNU chăm sóc 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

Nhưng một máy khách web cũng có nghĩa là thực hiện nhiều biến đổi hơn trên mã đó khi hiển thị tiêu đề (như ngưng tụ một số khoảng trống, loại bỏ các dấu đầu dòng và dấu). Tuy nhiên, không chắc là sẽ cần điều đó. Vì vậy, như trong các trường hợp khác, tùy bạn quyết định liệu nó có xứng đáng với nỗ lực hay không.

Bộ ký tự

Trước UTF-8, iso8859-1 từng là bộ ký tự ưa thích trên web cho các ký tự không phải ASCII mặc dù nói đúng ra chúng phải được viết là &eacute;. Các phiên bản gần đây hơn của HTTP và ngôn ngữ HTML đã thêm khả năng chỉ định bộ ký tự trong tiêu đề HTTP hoặc trong các tiêu đề HTML và khách hàng có thể chỉ định bộ ký tự mà nó chấp nhận. UTF-8 có xu hướng là bộ ký tự mặc định ngày nay.

Vì vậy, điều đó có nghĩa rằng ở ngoài kia, bạn sẽ tìm thấy éviết như &eacute;, như &#233;, như UTF-8 é, (0xc3 0xa9), như iso-8859-1 (0xe9), với cho những người cuối cùng 2, đôi khi các thông tin về charset trong các tiêu đề HTTP hoặc các tiêu đề HTML (ở các định dạng khác nhau), đôi khi thì không.

wget chỉ nhận được các byte thô, nó không quan tâm đến ý nghĩa của chúng như các ký tự và nó không cho máy chủ web biết về bộ ký tự ưa thích.

recode html..sẽ cẩn thận để chuyển đổi &eacute;hoặc &#233;thành chuỗi byte thích hợp cho bộ ký tự được sử dụng trên hệ thống của bạn, nhưng đối với phần còn lại, điều đó khó hơn.

Nếu bộ ký tự hệ thống của bạn là utf-8, nhiều khả năng nó sẽ ổn trong hầu hết thời gian vì đó có xu hướng là bộ ký tự mặc định được sử dụng hiện nay.

$ 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

Đó là étrên UTF-8 é.

Nhưng nếu bạn muốn trang trải cho các bộ ký tự khác, một lần nữa, nó sẽ phải được chăm sóc.

Cũng cần lưu ý rằng giải pháp này hoàn toàn không hoạt động đối với các trang được mã hóa UTF-16 hoặc UTF-32.

Tóm lại

Lý tưởng nhất, những gì bạn cần ở đây, là một trình duyệt web thực sự để cung cấp cho bạn thông tin. Đó là, bạn cần một cái gì đó để thực hiện yêu cầu HTTP với các tham số thích hợp, đặt lại phản hồi HTTP một cách chính xác, diễn giải đầy đủ mã HTML như một trình duyệt và trả lại tiêu đề.

Vì tôi không nghĩ rằng có thể được thực hiện trên dòng lệnh với các trình duyệt mà tôi biết (mặc dù bây giờ hãy xem mẹo nàylynx ), bạn phải dùng đến phương pháp phỏng đoán và xấp xỉ, và một trong những điều trên cũng tốt như bất kỳ.

Bạn cũng có thể muốn xem xét hiệu suất, bảo mật ... Ví dụ: để bao quát tất cả các trường hợp (ví dụ: một trang web có một số javascript được kéo từ trang web của bên thứ 3 đặt tiêu đề hoặc chuyển hướng đến một trang khác trong một onload hook), bạn có thể phải triển khai trình duyệt ngoài đời thực với các công cụ dom và javascript của nó có thể phải thực hiện hàng trăm truy vấn cho một trang HTML, một số trong đó cố gắng khai thác lỗ hổng ...

Mặc dù sử dụng biểu thức chính quy để phân tích HTML thường bị cau mày , đây là một trường hợp điển hình trong đó nó đủ tốt cho nhiệm vụ (IMO).


Nó cũng tải hình ảnh từ các trang? Nó cũng sẽ để lại các tập tin html rác phía sau?
Ufoguy

2
Bạn có thể muốn chấm dứt tiêu đề trong trường hợp đầu tiên <vì các tiêu đề không được đảm bảo có thẻ kết thúc và bất kỳ thẻ nào khác sẽ buộc chấm dứt tiêu đề. Bạn cũng có thể muốn tước dòng mới.
Brian Nickel

1
Không nên sử dụng các biểu thức thông thường để phân tích HTML. Không bao giờ. Ngay cả trong trường hợp này. Đó là một thói quen xấu. Sử dụng một trình phân tích cú pháp thực sự thay thế. Có một câu trả lời Stackoverflow hài hước nổi tiếng về điều này ...
Robin Green

4
@RobinGreen Bài đăng đó là về việc sử dụng regex để phân tích một ngôn ngữ không thông thường. Có một số cảnh báo, nhưng đây là một vấn đề dễ dàng giảm xuống một ngôn ngữ thông thường. Tôi khuyên bạn nên sử dụng regex để phân tích HTML. Đôi khi. Trong trường hợp này.
Brian Nickel

2
Và số lượng biểu thức chính quy hoạt động cho hầu hết mọi thứ là khoảng 0.
Robin Green

27

Bạn cũng có thể thử hxselect(từ HTML-XML-Utils ) wgetnhư sau:

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

Bạn có thể cài đặt các hxselectbản phân phối dựa trên Debian bằng cách sử dụng :
sudo apt-get install html-xml-utils.

Chuyển hướng STDERR là để tránh Input is not well-formed. (Maybe try normalize?)tin nhắn.

Để thoát khỏi "- YouTube", hãy chuyển đầu ra của lệnh trên sang awk '{print substr($0, 0, length($0)-10)}'.


"Hxselect" dường như không được cài đặt trên Ubuntu theo mặc định. Tôi thậm chí không thể tìm thấy nó trong kho lưu trữ hiện tại của tôi. Làm thế nào để tôi cài đặt nó?
Ufoguy

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

Tôi gặp lỗi này trên Ubuntu 12.10 "Đầu vào không được định dạng tốt. (Có thể thử bình thường hóa?)"
slm

1
Tôi không tìm thấy phải làm gì với thông điệp. về việc bình thường hóa đầu ra. Không có công tắc như vậy trên hxselect.
slm

1
Đối với Mac OS X folks Homebrew có một công thức với hxselect trong đó. Cài đặt với brew install html-xml-utils.
Sukima

18

Bạn cũng có thể sử dụng curlgrepđể làm điều này. Bạn sẽ cần phải tranh thủ việc sử dụng PCRE (Perl Tương thích Regular Expressions) trong grepđể có được cái nhìn phía sau và cơ sở vật chất nhìn về phía trước để chúng tôi có thể tìm thấy các <title>...</title>thẻ.

Thí dụ

$ curl 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -so - | \
    grep -iPo '(?<=<title>)(.*)(?=</title>)'
Why Are Bad Words Bad? - YouTube

Chi tiết

Các curlcông tắc:

  • -s = im lặng
  • -o - = gửi đầu ra tới STDOUT

Các grepcông tắc:

  • -i = trường hợp không nhạy cảm
  • -o = Chỉ trả lại phần phù hợp
  • -P = Chế độ PCRE

Mẫu để grep:

  • (?<=<title>) = tìm kiếm một chuỗi bắt đầu bằng chuỗi bên trái của chuỗi
  • (?=</title>) = tìm kiếm một chuỗi kết thúc bằng chuỗi bên phải của chuỗi
  • (.*)= mọi thứ ở giữa <title>..</title>.

Tình huống phức tạp hơn

Nếu <title>...</titie>kéo dài nhiều dòng, thì ở trên sẽ không tìm thấy nó. Bạn có thể giảm thiểu tình huống này bằng cách sử dụng tr, để xóa bất kỳ \nký tự nào , tức là tr -d '\n'.

Thí dụ

Hồ sơ mẫu.

$ cat multi-line.html 
<html>
<title>
this is a \n title
</TITLE>
<body>
<p>this is a \n title</p>
</body>
</html>

Và một mẫu chạy:

$ curl 'http://www.jake8us.org/~sam/multi-line.html' -so - | \
     tr -d '\n' | \
     grep -iPo '(?<=<title>)(.*)(?=</title>)'
this is a \n title

lang = ...

Nếu <title>được đặt như thế này, <title lang="en">thì bạn sẽ cần phải xóa cái này trước khi lấy grepnó. Công cụ này sedcó thể được sử dụng để làm điều này:

$ 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

Ở trên tìm thấy chuỗi không nhạy cảm trường hợp lang=theo sau là một chuỗi từ ( \w+). Sau đó nó được lột ra.

Trình phân tích cú pháp HTML / XML thực - sử dụng Ruby

Tại một số điểm regex sẽ thất bại trong việc giải quyết loại vấn đề này. Nếu điều đó xảy ra thì có khả năng bạn sẽ muốn sử dụng trình phân tích cú pháp HTML / XML thực sự. Một trình phân tích cú pháp như vậy là Nokogiri . Nó có sẵn trong Ruby dưới dạng Đá quý và có thể được sử dụng như vậy:

$ 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

Ở trên là phân tích dữ liệu đi qua curldưới dạng HTML ( Nokogiri::HTML). Phương thức xpathsau đó tìm kiếm các nút (thẻ) trong HTML là các nút lá, ( //) với tên title. Đối với mỗi tìm thấy, chúng tôi muốn trả về nội dung của nó ( e.content). Sau putsđó in chúng ra.

Trình phân tích cú pháp HTML / XML thực - sử dụng Perl

Bạn cũng có thể làm điều gì đó tương tự với Perl và mô-đun 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";

Sau đó, bạn có thể chạy tập lệnh này như vậy:

$ ./title_getter.pl http://www.jake8us.org/~sam/multi-line.html
this is a \n title 

1
Giải pháp gọn gàng! :)
coffeMug

3
Phân tích cú pháp HTML bằng các biểu thức thông thường không đơn giản như vậy. Các thẻ được viết dưới dạng khác <TITLE> Nghiêng, về <tiêu đề lang = en>,, <title \ n> không thể phù hợp với biểu thức của bạn. Vấn đề thậm chí còn lớn hơn, cả <tiêu đề> \ noops \ n </ title> 'sẽ không có.
manatwork

4
Cố gắng phân tích cú pháp html bằng regex có xu hướng được tán thành khi làm tròn ở đây.
dùng3490

1
@slm, <title>Unix\nLinux</title>có nghĩa là Unix Linux, không phải UnixLinux.
Stéphane Chazelas

1
+1 Đối với ruby ​​+ nokogiri. Tôi đã sử dụng nó cho tất cả các loại quét web, thật tuyệt vời!
Cướp

7

Sử dụng regex đơn giản để phân tích HTML là ngây thơ. Ví dụ với dòng mới và bỏ qua mã hóa ký tự đặc biệt được chỉ định trong tệp. Thực hiện đúng và thực sự phân tích trang bằng cách sử dụng bất kỳ trình phân tích cú pháp thực sự nào khác được đề cập trong các câu trả lời khác hoặc sử dụng một lớp lót sau:

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

(Ở trên bao gồm một ký tự Unicode).

BeautifulSoup cũng xử lý rất nhiều HTML không chính xác (ví dụ như thiếu các thẻ đóng), điều đó sẽ hoàn toàn ném ra biểu thức chính quy đơn giản. Bạn có thể cài đặt nó trong một python tiêu chuẩn bằng cách sử dụng:

pip install beautifulsoup4

hoặc nếu bạn không có pip, với

easy_install beautifulsoup4

Một số hệ điều hành như Debian / Ubuntu cũng được đóng gói ( python-bs4gói trên Debian / Ubuntu).


2
bs4không có trong thư viện chuẩn python. Bạn phải cài đặt nó bằng cách sử dụng easy_install beautfulsoup4(không easyinstall bs4).
Anthon

@Anthon bao gồm thông tin của bạn
Zelda

5

Có thể đó là "gian lận" nhưng một tùy chọn là Pup, trình phân tích cú pháp HTML dòng lệnh .

Đây là hai cách để làm điều đó:

Sử dụng metatrường với property="og:titlethuộc tính

$ wget -q 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -O - | \
> pup 'meta[property=og:title] attr{content}'
Why Are Bad Words Bad?

và một cách khác bằng cách sử dụng titletrường trực tiếp (và sau đó rút - YouTubechuỗi ở cuối).

$ wget -q 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' -O - | \
> pup 'title text{}' | sed 's/ - YouTube$//'
Why Are Bad Words Bad?

Để tránh các thực thể nhân vật, người dùng có thể muốn sử dụng --plaintùy chọn của con .
cao điểm

3

Có vẻ như có thể lynxsử dụng thủ thuật này ( zsh, bashcú pháp):

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'

Bởi vì đó là một trình duyệt web ngoài đời thực, nó không gặp phải nhiều hạn chế mà tôi đề cập trong câu trả lời khác của mình .

Ở đây, chúng tôi đang sử dụng thực tế là lynxđặt $LYNX_PRINT_TITLEbiến môi trường thành tiêu đề của trang hiện tại khi in trang.

Ở trên, chúng tôi đang cung cấp một tệp cấu hình (dưới dạng ống) xác định "máy in" lynx được gọi là Pchỉ xuất nội dung của biến đó sang mô tả tệp 3(mô tả tệp đó được chuyển hướng đến lynxthiết bị xuất chuẩn 3>&1trong khi lynx stdout được chuyển hướng đến / dev / null).

Sau đó, chúng tôi sử dụng lynxtiện ích kịch bản để mô phỏng người dùng nhấn pEnd(hay còn gọi là chọn) và Enter( ^J).

-accept_all_cookies vì nếu không lynx sẽ yêu cầu người dùng xác nhận cho mọi cookie.


3

Cách đơn giản:

curl -s example.com | grep -o "<title>[^<]*" | tail -c+8

Một vài lựa chọn thay thế:

curl -s example.com | grep -o "<title>[^<]*" | cut -d'>' -f2-
wget -qO- example.com | grep -o "<title>[^<]*" | sed -e 's/<[^>]*>//g'

1
Đây là những người duy nhất làm việc cho tôi!
Ahmad Awais

1

Tôi thích ý tưởng Stéphane Chazelas sử dụng Lynx và LYNX_PRINT_TITLE, nhưng tập lệnh đó không hoạt động với tôi trong Ubuntu 14.04.5.

Tôi đã tạo một phiên bản đơn giản hóa của nó bằng cách chạy Lynx và sử dụng các tệp được định cấu hình trước.

Thêm dòng sau vào /etc/lynx-cur/lynx.cfg (hoặc bất cứ nơi nào lynx.cfg của bạn cư trú):

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

Dòng này hướng dẫn lưu tiêu đề, trong khi in, thành "/home/account/title.txt" - bạn có thể chọn bất kỳ tên tệp nào bạn muốn. Bạn yêu cầu RẤT nhiều trang lớn, tăng giá trị trên từ "1000" lên bất kỳ số dòng nào trên mỗi trang bạn muốn, nếu không Lynx sẽ đưa ra lời nhắc bổ sung "khi in tài liệu chứa số lượng trang rất lớn".

Sau đó tạo tệp /home/account/lynx-script.txt với nội dung sau:

key p
key Select key
key ^J
exit

Sau đó chạy Lynx bằng các tùy chọn dòng lệnh sau:

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

Sau khi hoàn thành lệnh này, tệp /home/account/title.txt sẽ được tạo với tiêu đề của trang của bạn.

Tóm lại, đây là một hàm PHP trả về tiêu đề trang dựa trên URL đã cho hoặc sai trong trường hợp có lỗi.

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

Sử dụng nokogiri, người ta có thể sử dụng truy vấn dựa trên CSS đơn giản để trích xuất văn bản bên trong của thẻ:

 $ nokogiri -e 'puts $_.at_css("title").content'
 Why Are Bad Words Bad? - YouTube

Tương tự, để trích xuất giá trị của thuộc tính "nội dung" của thẻ:

$ nokogiri -e 'puts $_.at_css("meta[name=title]").attr("content")'
Why Are Bad Words Bad?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.