Як я можу отримати заголовок сторінки веб-сторінки (тег html заголовка) за допомогою Python?
Як я можу отримати заголовок сторінки веб-сторінки (тег html заголовка) за допомогою Python?
Відповіді:
Я завжди буду використовувати lxml для таких завдань. Ви також можете використовувати гарний суп.
import lxml.html
t = lxml.html.parse(url)
print t.find(".//title").text
РЕДАКТУВАТИ за коментарем
from urllib2 import urlopen
from lxml.html import parse
url = "https://www.google.com"
page = urlopen(url)
p = parse(page)
print p.find(".//title").text
Ось спрощена версія відповіді @Vinko Vrsalovic :
import urllib2
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen("https://www.google.com"))
print soup.title.string
ПРИМІТКА:
soup.title знаходить перший елемент заголовка в будь-якому місці документа HTML
title.string припускає, що він має лише один дочірній вузол, і цей дочірній вузол є рядком
Для beautifulsoup 4.x використовуйте інший імпорт:
from bs4 import BeautifulSoup
urlllib.requestзамість urllib2. Не знаю, чому. Щоб уникнути попередження BeautifulSoup про мій парсер, мені довелося це зробити soup = BeautifulSoup(urllib.request.urlopen(url), "lxml").
import urllib.request as urllibзамістьimport urllib2
<title></title>виконанні soup.title.stringповернетьсяNone
Не потрібно імпортувати інші бібліотеки. Запит має вбудовану функціональність.
>> 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'
Об’єкт механізованого браузера має метод title (). Тож код із цього допису можна переписати як:
from mechanize import Browser
br = Browser()
br.open("http://www.google.com/")
print br.title()
Це, мабуть, надмірно для такого простого завдання, але якщо ви плануєте зробити більше, ніж це, то розумніше починати з цих інструментів (механізувати, BeautifulSoup), оскільки вони набагато простіші у використанні, ніж альтернативи (urllib для отримання вмісту та регулярного виразу або якийсь інший парсер для синтаксичного аналізу html)
Посилання: BeautifulSoup механізувати
#!/usr/bin/env python
#coding:utf-8
from BeautifulSoup import BeautifulSoup
from mechanize import Browser
#This retrieves the webpage content
br = Browser()
res = br.open("https://www.google.com/")
data = res.get_data()
#This parses the content
soup = BeautifulSoup(data)
title = soup.find('title')
#This outputs the content :)
print title.renderContents()
Використання HTMLParser :
from urllib.request import urlopen
from html.parser import HTMLParser
class TitleParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.match = False
self.title = ''
def handle_starttag(self, tag, attributes):
self.match = tag == 'title'
def handle_data(self, data):
if self.match:
self.title = data
self.match = False
url = "http://example.com/"
html_string = str(urlopen(url).read())
parser = TitleParser()
parser.feed(html_string)
print(parser.title) # prints: Example Domain
r=urlopen(url), encoding = r.info().get_content_charset()і html_string = r.read().decode(encoding).
Використання регулярних виразів
import re
match = re.search('<title>(.*?)</title>', raw_html)
title = match.group(1) if match else 'No title'
group(0)повернув би весь матч. Див. Об’єкти збігу для довідки.
soup.title.stringфактично повертає рядок Unicode. Щоб перетворити це в звичайний рядок, потрібно це зробити
string=string.encode('ascii','ignore')
encodeдає), а не рядок, кодуйте з правильним charset. наприклад, string.encode('utf-8').
Ось відмовостійка HTMLParserреалізація.
Ви можете кинути майже все що завгодно, get_title()не зламавшись, якщо щось несподіване трапиться
get_title(), повернеться None.
При Parser()завантаженні сторінки він кодує його , ASCII
незалежно від кодування , що використовується на сторінці , ігноруючи будь-які помилки. Було б тривіально змінити, to_ascii()щоб перетворити дані в UTF-8або будь-яке інше кодування. Просто додайте аргумент кодування та перейменуйте функцію на щось подібне to_encoding().
За замовчуванням HTMLParser()зламається на зламаному html, навіть на таких тривіальних речах, як невідповідні теги. Щоб запобігти цій поведінці, я замінив HTMLParser()метод помилок на функцію, яка ігноруватиме помилки.
#-*-coding:utf8;-*-
#qpy:3
#qpy:console
'''
Extract the title from a web page using
the standard lib.
'''
from html.parser import HTMLParser
from urllib.request import urlopen
import urllib
def error_callback(*_, **__):
pass
def is_string(data):
return isinstance(data, str)
def is_bytes(data):
return isinstance(data, bytes)
def to_ascii(data):
if is_string(data):
data = data.encode('ascii', errors='ignore')
elif is_bytes(data):
data = data.decode('ascii', errors='ignore')
else:
data = str(data).encode('ascii', errors='ignore')
return data
class Parser(HTMLParser):
def __init__(self, url):
self.title = None
self.rec = False
HTMLParser.__init__(self)
try:
self.feed(to_ascii(urlopen(url).read()))
except urllib.error.HTTPError:
return
except urllib.error.URLError:
return
except ValueError:
return
self.rec = False
self.error = error_callback
def handle_starttag(self, tag, attrs):
if tag == 'title':
self.rec = True
def handle_data(self, data):
if self.rec:
self.title = data
def handle_endtag(self, tag):
if tag == 'title':
self.rec = False
def get_title(url):
return Parser(url).title
print(get_title('http://www.google.com'))
Використання lxml ...
Отримання його з метатегу на сторінці відповідно до протоколу Facebook Opengraph:
import lxml.html.parse
html_doc = lxml.html.parse(some_url)
t = html_doc.xpath('//meta[@property="og:title"]/@content')[0]
або використовуючи .xpath з lxml:
t = html_doc.xpath(".//title")[0].text