将变量传递给 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)
我打算打开一堆 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)