2011-05-11 43 views
3

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

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

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

是否有任何其他简单的方法来做到这一点在python中。

+0

您是否尝试过LXML HTML吗?它快于bs – 2011-05-11 07:07:21

回答

2

您可以随时使用正则表达式来执行此操作,但如果您获得格式不正确的页面,则可能会中断此操作。这会是这样的:

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

哦,我不知道编译的正则表达式有一个“搜索”方法。这很方便,我一直在传递它。 – zeekay 2011-05-11 06:33:21

3

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

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

你应该限制通配符''。*?''和''| re.DOTALL'',所以''.''匹配换行符。 – ThomasH 2011-05-11 16:29:07

+0

是的好点。 – zeekay 2011-05-11 16:30:41

+0

难道你不能以迭代的方式阅读网页,只要标题被发现就停下来吗?当只有标题需要时,似乎可以可靠地跳过任何网站的所有内容。 – pir 2017-05-22 23:21:09

2

你甚至可以使用简单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解析,它占用了大部分时间。 (我的猜测是,open(url).read() 5000资源需要很长一段时间了。这样你就不会消除,无论如何你“解析”的HTML。)

+1

难道你不能以迭代的方式阅读网页,只要标题被发现就停下来吗?当只有标题需要时,似乎可以可靠地跳过任何网站的所有内容。 – pir 2017-05-22 23:20:50

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'