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