将变量传递给urlopen()并使用bs4在python中再次读取它

时间:2015-04-08 01:04:33

标签: python html variables beautifulsoup logic

我打算打开一堆链接,其中唯一改变的是链接末尾的年份。我正在使用下面的代码,但它返回了一堆错误。我的目的是打开该链接并过滤页面上的一些内容,但首先我需要打开所有页面,以便我有测试代码。代码如下:

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等],那也很棒。

2 个答案:

答案 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)