如何使用Python检索网页的页面标题?

如何使用Python检索网页的页面标题?,python,html,Python,Html,如何使用Python检索网页的页面标题(标题html标记)?我将始终用于此类任务。你也可以用 根据评论进行编辑: 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) 对于这样一个简单的任务来说,这可能

如何使用Python检索网页的页面标题(标题html标记)?

我将始终用于此类任务。你也可以用

根据评论进行编辑:

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)

对于这样一个简单的任务来说,这可能有些过分,但是如果您打算做更多的事情,那么从这些工具(机械化、美化组)开始就更明智了,因为它们比其他工具(urllib获取内容和regexen或其他解析html的解析器)更容易使用

链接:


mechanize浏览器对象具有title()方法。因此,中的代码可以重写为:

from mechanize import Browser
br = Browser()
br.open("http://www.google.com/")
print br.title()

以下是以下内容的简化版本:

注:

  • soup.title在html文档中的任何位置查找第一个title元素

  • title.string假定它只有一个子节点,而该子节点是一个字符串

对于,请使用不同的导入:

from bs4 import BeautifulSoup

soup.title.string
实际上返回一个unicode字符串。 要将其转换为普通字符串,需要执行以下操作
string=string.encode('ascii','ignore')
使用:


无需导入其他库。请求内置了此功能

>> 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' 
听众={'headers':'Mozilla/5.0(X11;Ubuntu;Linux x86_64;rv:51.0)Gecko/20100101 Firefox/51.0'} >>>n=请求。获取('http://www.imdb.com/title/tt0108778/,标题=听者) >>>al=n.text >>>al[al.find(“”)+7:al.find(“”)] 《你的朋友》(电视连续剧1994\u2013-2004)-IMDb'
使用正则表达式

import re
match = re.search('<title>(.*?)</title>', raw_html)
title = match.group(1) if match else 'No title'
重新导入
匹配=重新搜索(“(.*?”,原始html)
标题=匹配。如果匹配,则分组(1)否则为“无标题”

这是一个容错的
HTMLPasser
实现。
如果发生意外情况,您可以在
get_title()
上抛出几乎任何东西,而不会使其中断
get\u title()
将返回
None

Parser()
下载页面时,它将其编码为
ASCII
不管页面中使用的字符集如何,忽略任何错误。 将
更改为_ascii()
以将数据转换为
UTF-8
或任何其他编码是很简单的。只需添加一个编码参数并将函数重命名为类似于
to_encoding()

默认情况下,
HTMLParser()
会在坏掉的html上坏掉,甚至会在不匹配的标记之类的小事上坏掉。为了防止这种行为,我用一个忽略错误的函数替换了
HTMLParser()
的error方法

#-*-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

使用soup.select_one以目标标题标记为目标

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('url')
soup = bs(r.content, 'lxml')
print(soup.select_one('title').text)

在Python3中,我们可以从
urllib.request
调用方法
urlopen
,从
bs4
库调用
beautifulsou
来获取页面标题

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("https://www.google.com")
soup = BeautifulSoup(html, 'lxml')
print(soup.title.string)

这里我们使用的是最高效的解析器“lxml”。

如果您在上面的代码中出现IOError:,您可以感谢您!如果有人遇到类似的问题,在我的Python3环境中,我必须使用
urllib.request
而不是
urllib2
。不知道为什么。为了避免有关我的解析器的BeautifulSoup警告,我必须执行
soup=BeautifulSoup(urllib.request.urlopen(url),“lxml”)
。对于Python3,请使用
导入urllib.request作为urllib
而不是
导入urllib2
注意,如果缺少title属性或空title作为
执行
soup.title.string
将返回
None
@Eitanmg:事实上,值得注意的是,此脚本适用于Python3。在Python3.x中,HtmlParser模块被重命名为html.parser。类似地,Python3中添加了urllib.request。最好将字节显式转换为字符串,
r=urlopen(url)
encoding=r.info().get\u content\u charset()
,以及
html\u string=r.read().decode(encoding)
。这将删除所有可能不是您想要的非ascii字符。如果您确实想要字节(编码所提供的内容)而不是字符串,请使用正确的字符集编码。e、 例如,
string.encode('utf-8')
。实际上是什么。组(1)?任何引用?Hi,
组(0)
都将返回整个匹配。请参阅以供参考。如果标题标记的格式不完全相同(大写、混合大小写、空格),这将错过任何情况。如果标题标记中有其他数据,我也将包括在内。由于提出了这个问题,许多网页已开始使用og:title meta标记,其中包含原始标题,while通常以其他数据作为前缀和后缀。最初,Facebook只是作为OpenGraph的一部分使用,许多网站都提供OpenGraph元数据。og:title已经成为页面标题的标准来源,尤其是新闻文章。通常,“导入其他库”似乎会导致更多的工作。谢谢你帮我们避免这种情况!
import lxml.html.parse
html_doc = lxml.html.parse(some_url)

t = html_doc.xpath('//meta[@property="og:title"]/@content')[0]
t = html_doc.xpath(".//title")[0].text
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('url')
soup = bs(r.content, 'lxml')
print(soup.select_one('title').text)
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("https://www.google.com")
soup = BeautifulSoup(html, 'lxml')
print(soup.title.string)