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

passing a variable to urlopen() and reading it again in python using bs4

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

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 etc] 也很好。

这可能是因为您要声明 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).

进行迭代

正如 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)