在python中只检索网页的标题

时间:2011-05-11 06:23:50

标签: python html beautifulsoup

我有超过5000个网页,我想要所有这些网页的标题。在我的项目中,我使用的是BeautifulSoup html解析器。

soup = BeautifulSoup(open(url).read())
soup('title')[0].string

但它耗费了大量时间。只是为了网页的标题,我正在阅读整个文件并构建解析树(我认为这是延迟的原因,如果我错了,请纠正我。)

在python中有没有其他简单的方法可以做到这一点。

4 个答案:

答案 0 :(得分:2)

如果你只使用一个简单的正则表达式肯定会更快,BeautifulSoup非常慢。你可以这样做:

import re
regex = re.compile('<title>(.*?)</title>', re.IGNORECASE|re.DOTALL)
regex.search(string_to_search).group(1)

答案 1 :(得分:1)

您总是可以使用正则表达式来执行此操作,但如果您获得格式错误的页面,则可能会中断。那就是这样的:

import re
titleRE = re.compile("<title>(.+?)</title>")
title = titleRE.search(s).group(1)

答案 2 :(得分:1)

您甚至可以使用简单的string methods

html = '<html> lots of crap <title>Title</title> even more crap </html>'
start = html.find('<title>') + 7 # Add length of <title> tag
end = html.find('</title>', start)
title = html[start:end]

但是,这只能保证在页面<title>之前找到</title>。不是它在<head>部分或任何内容。

此外,你应该验证你的假设,它实际上 BeautifulSoup解析,它占据了大部分时间。 (我的猜测是,5,000个资源的open(url).read()也花费了相当长的时间。这不会消除,无论如何你“解析”HTML。)

答案 3 :(得分:0)

尝试

>> 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'