9 ответов:
Я всегда буду использовать lxml для таких задач. Вы могли бы использовать beautifulsoup как хорошо.
import lxml.html t = lxml.html.parse(url) print t.find(".//title").text
вот упрощенная версия @ ответ Винко Врсаловича:
import urllib2 from BeautifulSoup import BeautifulSoup soup = BeautifulSoup(urllib2.urlopen("https://www.google.com")) print soup.title.stringПримечание:
суп.название находит первый title элемент в любом месте в html-документе
название.строка предполагает, что он имеет только один дочерний узел, и этот дочерний узел является строка
для beautifulsoup 4.x, используйте другой импорт:
from bs4 import BeautifulSoup
объект mechanize Browser имеет метод title (). Так что код от этот пост можно переписать так:
from mechanize import Browser br = Browser() br.open("http://www.google.com/") print br.title()
Это, вероятно, излишне для такой простой задачи, но если вы планируете сделать больше, то разумнее начать с этих инструментов (mechanize, BeautifulSoup), потому что они намного проще в использовании, чем альтернативы (urllib для получения контента и regexen или какой-либо другой парсер для разбора 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()
нет необходимости импортировать другие библиотеки. Запрос имеет эту встроенную функциональность.
>> 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'
С помощью 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 = True if tag == 'title' else False 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
С помощью регулярных выражений
import re match = re.search('<title>(.*?)</title>', raw_html) title = match.group(1) if match else 'No title'
soup.title.stringфактически возвращает строку Юникода. Чтобы преобразовать это в обычную строку, вам нужно сделатьstring=string.encode('ascii','ignore')
здесь представляет собой отказоустойчивую
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'))
Comments