如何在Python中检查页面是否为HTML页面?

3

我试图用Python编写网络爬虫代码。 我想检查我即将爬行的页面是否是HTML页面,而不是像.pdf / .doc / .docx等页面。 我不想使用扩展名.html来检查它,因为像asp,aspx或像http://bing.com/travel/这样的页面没有显式的.html扩展名,但它们是HTML页面。在Python中有没有好的方法?


4
我认为MIME类型是一个不错的选择。 - Waleed Khan
不加载任何页面数据?听起来很难。否则,为什么不只是检查“content-type”,或者读取前几个字节并查看它是否像HTML?(例如以<DOCTYPE><html>开头) - Henry Keiter
可以加载任何页面数据。我刚试了正则表达式 .<.*html.*>." 来检查前几个字节,因为页面可能是 <!DOCTYPE html>... 或 <html>,但是对于某些页面,ra.match 会进入无限循环。 - user2793286
你想要多准确呢?你可以选择相信内容类型头或不相信。你可以尝试解析HTML,也可以不解析。没有“正确”的方法,这取决于你希望HTML检查实际上有多准确/快速。 - Mark Hildreth
我更喜欢能够准确工作的东西。如果不需要阅读内容就能做到,那就更好了。 - user2793286
2个回答

5

这只从服务器获取标题:

import urllib2
url = 'http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.7-rc6.tar.bz2'
req = urllib2.Request(url)
req.get_method = lambda: 'HEAD'
response = urllib2.urlopen(req)
content_type = response.headers.getheader('Content-Type')
print(content_type)

打印

application/x-bzip2

从中你可以得出这不是HTML。你可以使用

'html' in content_type

编写程序测试内容是否为HTML(或可能是XHTML)。

如果您希望更加确定内容是否为HTML,可以下载内容并尝试使用HTML解析器(例如lxmlBeautifulSoup)进行解析。

请注意不要像下面这样使用requests.get

import requests
r = requests.get(url)
print(r.headers['content-type'])

这需要很长时间,我的网络监视器显示持续的负载,让我相信这是在下载整个文件,而不仅仅是头部信息。

另一方面,

import requests
r = requests.head(url)
print(r.headers['content-type'])

仅获取头部信息。


3

不要被标准库困扰,而是尝试使用requests

>>> import requests
>>> r = requests.get("http://www.google.com")
>>> r.headers['content-type']
    'text/html; charset=ISO-8859-1'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接