我打算打开一堆链接,其中唯一改变的是链接末尾的年份。我正在使用下面的代码,但它返回了一堆错误。我的目的是打开该链接并过滤页面上的一些内容,但首先我需要打开所有页面,以便我有测试代码。代码如下:
from xlwt import *
from urllib.request import urlopen
from bs4 import BeautifulSoup, SoupStrainer
from xlwt.Style import *
j=2014
for j in range(2015):
conv=str(j)
content = urlopen("http://en.wikipedia.org/wiki/List_of_Telugu_films_of_%s").read() %conv
j+=1
print(content)
错误:
Traceback (most recent call last):
File "F:\urltest.py", line 11, in <module>
content = urlopen("http://en.wikipedia.org/wiki/List_of_Telugu_films_of_%s").read() %conv
File "C:\Python34\lib\urllib\request.py", line 161, in urlopen
return opener.open(url, data, timeout)
File "C:\Python34\lib\urllib\request.py", line 469, in open
response = meth(req, response)
File "C:\Python34\lib\urllib\request.py", line 579, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python34\lib\urllib\request.py", line 507, in error
return self._call_chain(*args)
File "C:\Python34\lib\urllib\request.py", line 441, in _call_chain
result = func(*args)
File "C:\Python34\lib\urllib\request.py", line 587, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request
需要一点指导。如果还有其他方法可以传递变量[2014,2015等],那也很棒。
答案 0 :(得分:1)
这可能是因为您声明j
然后在循环结束时修改它。 range()
已经为您执行此操作,因此您无需增加它。此外,您的字符串插值语法看起来错误。请务必在字符串后面包含变量。 print("Hi %s!" % name)
。
尝试:
for j in range(2015):
conv=str(j)
content = urlopen("http://en.wikipedia.org/wiki/List_of_Telugu_films_of_%s" % conv).read()
此外,我假设您不想从0年到2015年进行查询。您可以致电range(start_year, end_year)
来[start_year, end_year)
进行迭代。
答案 1 :(得分:1)
正如cesar在他的回答中指出的那样,因为你已经在循环中,所以不需要递增j。此外,j = 0在开始时没有任何效果,因为你的循环无论如何从0开始。
这将创建一个名为contents的字典,其中每个键指的是相应年份的页面:
import urllib2
url = "http://en.wikipedia.org/wiki/List_of_Telugu_films_of_%d"
contents = {year:urllib2.urlopen(url % year).read()
for year in range(2014,2015+1)}
但是,如果您要加载多个页面,我认为最好的方法是先将每个文件保存到本地磁盘,然后从那里加载以进行进一步处理。
这可能是因为您可能希望多次返回解析过程,但只想下载文件一次。所以考虑做类似的事情:
#reading, (only once)
for year in range(start_year,end_year+1):
with open('year_%d.txt' % year,'w') as f:
f.write(urllib2.urlopen(url % year).read())
#processing
for year in range(start_year,end_year+1):
with open('year_%d.txt','r') as f:
page = f.read()
process(page)