无法使用urllib2获取网址

时间:2015-11-09 23:16:01

标签: python python-2.7 beautifulsoup


我正在学习Python,今天的案例是从网页下载文本。 这段代码工作正常:

import urllib2
from bs4 import BeautifulSoup
base_url = "http://www.pracuj.pl"
url = urllib2.urlopen(base_url+"/praca/big%20data;kw").read()
soup = BeautifulSoup(url,"html.parser")

for k in soup.find_all('a'):
    if "offer__list_item_link_name" in k['class']: 
        link = base_url+k['href']
        print link

所以它会打印所有这样的链接:

http://www.pracuj.pl/praca/inzynier-big-data-cloud-computing-knowledge-discovery-warszawa,oferta,4212875
http://www.pracuj.pl/praca/data-systems-administrator-krakow,oferta,4204109
http://www.pracuj.pl/praca/programista-java-sql-python-w-zespole-bigdata-krakow,oferta,4204341
http://www.pracuj.pl/praca/program-challenging-projektowanie-i-tworzenie-oprogramowania-katowice,oferta,4186995
http://www.pracuj.pl/praca/program-challenging-analizy-predyktywne-warszawa,oferta,4187512
http://www.pracuj.pl/praca/software-engineer-r-language-krakow,oferta,4239818

当添加一行来分配新地址时,要获取每一行内容:

url2 = urllib2.urlopen(link).read()

我收到错误:

Traceback (most recent call last):
  File "download_page.py", line 10, in <module>
    url2 = urllib2.urlopen(link).read()
NameError: name 'link' is not defined

有什么问题,它只在for循环中起作用。当我在循环外添加相同的行时,它可以工作。

你能指出我做错了吗?

的Pawel

2 个答案:

答案 0 :(得分:1)

我认为您的行url2 = urllib2.urlopen(link).read()link变量的范围不同。 link变量是for循环范围的本地变量,因此如果您在for循环内移动调用它将起作用。

for k in soup.find_all('a'):
    if "offer__list_item_link_name" in k['class']: 
        link = base_url+k['href']
        url2 = urllib2.urlopen(link).read()

如果您要处理for循环外的网址,请将链接保存在列表中:

links = []
for k in soup.find_all('a'):
    if "offer__list_item_link_name" in k['class']: 
        link = base_url+k['href']
        links.append(link)

for link in links:
    #do stuff with link

答案 1 :(得分:0)

这实际上对我有用。你是如何格式化代码的?

我看起来模糊不清:

for k in soup.find_all('a'):
if "offer__list_item_link_name" in k['class']: 
    link = base_url+k['href']
    #print link
    url2 = urllib2.urlopen(link).read()
    print url2

并且工作正常。