Python: найти <title> - PullRequest
       3

Python: найти <title>

0 голосов
/ 20 мая 2010

У меня есть это:

response = urllib2.urlopen(url)
html     = response.read()

begin = html.find('<title>')
end   = html.find('</title>',begin)
title = html[begin+len('<title>'):end].strip()

если url = http://www.google.com, тогда заголовок не имеет проблем как "Google",

но если url = "http://www.britishcouncil.org/learning-english-gateway", тогда заголовок становится

"<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<base href="http://www.britishcouncil.org/" />
<META http-equiv="Content-Type" Content="text/html;charset=utf-8">
<meta name="WT.sp" content="Learning;Home Page Smart View" />
<meta name="WT.cg_n" content="Learn English Gateway" />
<META NAME="DCS.dcsuri" CONTENT="/learning-english-gateway.htm">..."

Что на самом деле происходит, почему я не могу вернуть «титул»?

Ответы [ 3 ]

7 голосов
/ 20 мая 2010

Этот URL возвращает документ с <TITLE>...</TITLE> и find с учетом регистра. Я настоятельно рекомендую вам использовать HTML-парсер, например Beautiful Soup .

2 голосов
/ 20 мая 2010

Давайте проанализируем, почему мы получили этот ответ. Если вы откроете веб-сайт и просмотрите исходный код, мы заметим, что он не имеет <title>...</title>. Вместо этого у нас есть <TITLE>...</TITLE>. Так что же случилось с 2 звонками? Оба будут -1!

begin = html.find('<title>')   # Result: -1
end   = html.find('</title>')  # Result: -1

Тогда begin+len('<title>') будет -1 + 7 = 6. Таким образом, ваша последняя строка будет извлекать html[6:-1]. Оказывается, что отрицательные индексы на самом деле означают что-то законное в Python (по уважительным причинам). Это значит считать со спины. Следовательно, -1 здесь относится к последнему символу в html. Итак, вы получаете подстроку от 6-го символа (включительно) до последнего символа (не включительно).

Что мы можем сделать тогда? Ну, во-первых, вы можете использовать средство сравнения регулярных выражений, которое игнорирует регистр, или использовать правильный анализатор HTML. Если это одноразовая вещь, а пространство / производительность не представляют большой проблемы, самый быстрый подход может заключаться в создании копии html и размещении строки в нижнем регистре:

def get_title(html):
    html_lowered = html.lower();
    begin = html_lowered.find('<title>')
    end = html_lowered.find('</title>')
    if begin == -1 or end == -1:
        return None
    else:
        # Find in the original html
        return html[begin+len('<title>'):end].strip()
0 голосов
/ 24 августа 2014

Рабочий раствор с lxml и urllib с использованием Python 3

import lxml.etree, urllib.request

def documenttitle(url):
    conn = urllib.request.urlopen(url)
    parser = lxml.etree.HTMLParser(encoding = "utf-8")
    tree = lxml.etree.parse(conn, parser = parser)
    return tree.find('.//title')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...