我有超过5000个网页,我想要所有这些网页的标题。在我的项目中,我使用的是BeautifulSoup html解析器。
soup = BeautifulSoup(open(url).read())
soup('title')[0].string
但它耗费了大量时间。只是为了网页的标题,我正在阅读整个文件并构建解析树(我认为这是延迟的原因,如果我错了,请纠正我。)
在python中有没有其他简单的方法可以做到这一点。
答案 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'