2014-11-08 26 views
7

Cách đơn giản nhất để lấy tiêu đề của trang trong Yêu cầu là gì?Cách lấy tiêu đề trang trong các yêu cầu

r = requests.get('http://www.imdb.com/title/tt0108778/') 
# ? r.title 
Friends (TV Series 1994–2004) - IMDb 
+1

Nếu bạn đang làm bất cứ điều gì ngoài grabbing một trang duy nhất, [Scrapy] (http: // scrapy.org/doc/) có thể rất hữu ích. –

Trả lời

10

Bạn cần một phân tích cú pháp HTML để phân tích phản ứng HTML và nhận được văn bản title thẻ của:

Ví dụ sử dụng lxml.html:

>>> import requests 
>>> from lxml.html import fromstring 
>>> r = requests.get('http://www.imdb.com/title/tt0108778/') 
>>> tree = fromstring(r.content) 
>>> tree.findtext('.//title') 
u'Friends (TV Series 1994\u20132004) - IMDb' 

Có chắc chắn là các tùy chọn khác, ví dụ: mechanize thư viện:

>>> import mechanize 
>>> br = mechanize.Browser() 
>>> br.open('http://www.imdb.com/title/tt0108778/') 
>>> br.title() 
'Friends (TV Series 1994\xe2\x80\x932004) - IMDb' 

Tùy chọn để chọn phụ thuộc vào việc bạn sẽ làm gì tiếp theo: phân tích trang để nhận thêm dữ liệu hoặc có thể tương tác với nó: nhấp vào nút, gửi biểu mẫu, theo liên kết, v.v.

Bên cạnh đó, bạn có thể muốn sử dụng một API được cung cấp bởi IMDB, thay vì đi xuống sang HTML phân tích cú pháp, xem:

Ví dụ sử dụng một gói IMDbPY:

>>> from imdb import IMDb 
>>> ia = IMDb() 
>>> movie = ia.get_movie('0108778') 
>>> movie['title'] 
u'Friends' 
>>> movie['series years'] 
u'1994-2004' 
5

Bạn có thể sử dụng beautifulsoup để phân tích cú pháp HTML.

Cài đặt nó bằng cách sử pip install beautifulsoup4

>>> import requests 
>>> r = requests.get('http://www.imdb.com/title/tt0108778/') 
>>> import bs4 
>>> html = bs4.BeautifulSoup(r.text) 
>>> html.title 
<title>Friends (TV Series 1994–2004) - IMDb</title> 
>>> html.title.text 
u'Friends (TV Series 1994\u20132004) - IMDb' 
+0

Tại sao có 'r' hiện diện trước' requests.get'? –

3

Không cần phải nhập khẩu các thư viện khác. Yêu cầu có chức năng này được tích hợp sẵn.

>>> hearders = {'headers':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0'} 
>>> n = requests.get('http://www.imdb.com/title/tt0108778/', headers=hearders) 
>>> al = n.text 
>>> al[al.find('<title>') + 7 : al.find('</title>')] 
u'Friends (TV Series 1994\u20132004) - IMDb' 

Cập nhật sau ZN13's bình luận

>>> import re 
>>> import requests 
>>> n = requests.get('https://www.libsdl.org/release/SDL-1.2.15/docs/html/guideinputkeyboard.html') 
>>> al = n.text 
>>> d = re.search('<\W*title\W*(*)</title', al, re.IGNORECASE) 
>>> d.group(1) 
u'Handling the Keyboard' 

này sẽ làm việc cho tất cả các trường hợp dù thêm các ký tự không tự chữ cái có mặt với thẻ tiêu đề hay không.

+1

Điều này không hoạt động nếu thẻ tiêu đề có dòng mới trong đó, ví dụ: ' '(ví dụ: với trang này: https://www.libsdl.org/release/SDL-1.2.15/docs/html/ guideinputkeyboard.html) – ZN13

1

Regex với lookbehind và lookforward:

re.search('(?<=<title>).+?(?=</title>)', mytext, re.DOTALL).group().strip() 

re.DOTALL vì tiêu đề có thể có một ký tự dòng mới \n

Các vấn đề liên quan