urllib.urlopen只运行一次

时间:2015-10-30 13:52:12

标签: python python-2.7

我正在关于Coursera进行在线课程,我在其中一项任务中遇到了一些问题。我不是要求任何人解决它,只是......一些指导会有所帮助:)

import urllib
from BeautifulSoup import *

url = raw_input('Enter URL: ')
if len(url) < 1:
    url = "http://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html"
count = int(raw_input('Enter count: '))
pos = int(raw_input('Enter position: ')) - 1
taglist = list()
urllist = list()
urllist.append(url)

print 'Retrieving: ', urllist[0]


for i in range(count):
    html = urllib.urlopen(urllist[-1]).read()
    soup = BeautifulSoup(html)
    tags = soup('a')
    for tag in tags:
        taglist.append(tag)
    url = taglist[pos].get('href', None)
    print 'Retrieving: ', url
    urllist.append(url)
print 'Last Url: ', urllist[-1]

“程序将使用urllib从下面的数据文件中读取HTML,从锚标记中提取href = vaues,从顶部扫描特定位置的标记并按照该链接重复该过程多次,并报告您找到的姓氏。“

代码中的链接只是一个包含指向其他链接的链接的页面。

这是设计输出:

Enter URL: http: ... /known_by_Fikret.html
Enter count: 4
Enter position: 3
Retrieving: http: ... /known_by_Fikret.html
Retrieving: http: ... /known_by_Montgomery.html
Retrieving: http: ... /known_by_Mhairade.html
Retrieving: http: ... /known_by_Butchi.html
Last Url: http: ... /known_by_Anayah.html

我遇到的问题是urllib不会多次运行,只运行一次。我知道我做错了什么但是无法理解:/

4 个答案:

答案 0 :(得分:0)

我不确定你的意思是说它只运行一次,但我猜这里有问题:

for tag in tags:
    taglist.append(tag)

你继续在循环的每次迭代中附加taglist,保留其中的所有内容,因此在第一次迭代后,taglist[pos]总是只指向同一个网址。

在重新填充之前,您需要清除taglist,例如

taglist = list()
for tag in tags:
    taglist.append(tag)

答案 1 :(得分:0)

Marco清除你的标签清单是正确的。但是,尽管您的代码现在可以正常运行,但您仍然无法获得预期的结果。 改变自:

  

url = taglist [pos] .get(&#39; href&#39;,None)

  

url = taglist [pos-1] .get(&#39; href&#39;,None)

希望它有所帮助。

答案 2 :(得分:0)

似乎是一个很好的方法,我也采取相同的在线课程。您应该在每次迭代中初始化它,而不是附加标记列表,以便列表中的每个“pos”项都是需要的新URL。 这是for循环的修改:

for i in range(count):
  html = urllib.urlopen(url).read()
  soup = BeautifulSoup(html)
  tags = soup('a')
  for tag in tags:
    taglist.append(tag)
  url = taglist[pos].get('href', None)
  print 'Retrieving: ', url
  urllist.append(url)
  taglist = list()
print 'Last Url: ', urllist[-1]

答案 3 :(得分:0)

使用以下内容简化: 在python 2.7和BeautifulSoup4

上测试并完美地为我工作
import urllib
from BeautifulSoup import *
taglist=list()
url=raw_input("Enter URL: ")
count=int(raw_input("Enter count:"))
position=int(raw_input("Enter position:"))
for i in range(count):
    print "Retrieving:",url
    html=urllib.urlopen(url).read()
    soup=BeautifulSoup(html)
    tags=soup('a')
    for tag in tags:
        taglist.append(tag)
    url = taglist[position-1].get('href', None)
    del taglist[:]
print "Retrieving:",url

在您的代码中,在每次成功迭代后清除标记列表:

for i in range(count):
    html = urllib.urlopen(urllist[-1]).read()
    soup = BeautifulSoup(html)
    tags = soup('a')
    for tag in tags:
        taglist.append(tag)
    url = taglist[pos].get('href', None)
    print 'Retrieving: ', url
    urllist.append(url)
    del taglist[:]    \add this line to clear the taglist