2015-12-20 45 views
1

我试图创建一个webcrawler,它解析页面上的所有html,抓取指定的链接(通过raw_input),跟随该链接,然后重复此过程指定的次数(一次再次通过raw_input)。我能够抓住第一个链接并成功打印出来。但是,我有问题“循环”整个过程,并且通常会抓住错误的链接。这是第一个链接与webcrawler链接出现问题

https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html

(全面披露,这个问题涉及到分配的Coursera课程)

这里是我的代码

import urllib 
from BeautifulSoup import * 
url = raw_input('Enter - ') 
rpt=raw_input('Enter Position') 
rpt=int(rpt) 
cnt=raw_input('Enter Count') 
cnt=int(cnt) 
count=0 
counts=0 
tags=list() 
soup=None 
while x==0: 
    html = urllib.urlopen(url).read() 
    soup = BeautifulSoup(html) 
# Retrieve all of the anchor tags 
    tags=soup.findAll('a') 
    for tag in tags: 
     url= tag.get('href') 
     count=count + 1 
     if count== rpt: 
      break 
counts=counts + 1 
if counts==cnt:   
    x==1  
else: continue 
print url 
+1

我不完全理解输入。该网址非常清晰。但为什么这个位置和计数?另外你为什么要重做整个过程多次?你不是只需要抓取页面上的所有网址?通常你只需要加载一次页面并获得所有的标签。你能详细说明吗? – DJanssens

+0

对不起,如果我不清楚,我想webcrawler抓住网页上的链接,例如,如果用户输入“位置”为3,“计数”为4,它会抓住第三个链接,然后输入链接到urllib,解析该链接,获取该页面上的第三个链接,并循环4次,如“count”输入中指定的那样。 –

+1

但是,你不需要加载页面4次,对吧?您可以将解析的链接存储为列表,并只使用用户指定的链接。 – DJanssens

回答

0

我相信这是你是什么寻找:

import urllib 
from bs4 import * 
url = raw_input('Enter - ') 
position=int(raw_input('Enter Position')) 
count=int(raw_input('Enter Count')) 

#perform the loop "count" times. 
for _ in xrange(0,count): 
    html = urllib.urlopen(url).read() 
    soup = BeautifulSoup(html) 
    tags=soup.findAll('a') 
    for tag in tags: 
     url= tag.get('href') 
     tags=soup.findAll('a') 
     # if the link does not exist at that position, show error. 
     if not tags[position-1]: 
      print "A link does not exist at that position." 
     # if the link at that position exist, overwrite it so the next search will use it. 
     url = tags[position-1].get('href') 
print url 

代码wil现在循环输入中指定的次数,每次它将href放在给定的位置并将其替换为url,这样每个循环将在树形结构中看起来更进一步。

我建议你使用变量的全名,这是很容易理解的。另外,您可以将它们投射并在一行中阅读,这使您的开始更容易遵循。

+0

我很欣赏你花时间去帮助我,但这不是我要找的。这将链接添加到列表中,然后打印这些指定的链接。我期望做的是使用页面上的链接之一作为排序点。因此,抓取工具会通过'tag.get('href')'获取其中一个链接,将其重新插入文件开启器'urllib.urlopen(url).read',然后解析该页面,获取链接,重新插入一个放入文件打开器,并重复指定的次数。不知道我是否做得更清楚,对不起,如果我没有意义。 –

+0

啊哈得到了它,我仍然对参数有点困惑。所以这个位置表示应该返回页面上的哪个链接,并且计数表明该过程应该重复多少次,每次在url树中进行更深入的处理并拿走3th分支? – DJanssens

+0

是的,这是解释它的好方法。然而,我在原始代码中意识到,在第一次迭代之后内部循环没有办法破坏,因为在第一次迭代之后,count总是会大于用户指定的数字。但是,即使内部循环固定,外部循环也不会中断 –

1

基于DJanssens的回应,我找到了解决方案;

url = tags[position-1].get('href') 

为我做了诡计!

感谢您的协助!

1

我还参与了该课程,并与一位朋友的帮助,我得到了这个工作了:

import urllib 
from bs4 import BeautifulSoup 

url = "http://python-data.dr-chuck.net/known_by_Happy.html" 
rpt=7 
position=18 

count=0 
counts=0 
tags=list() 
soup=None 
x=0 
while x==0: 
    html = urllib.urlopen(url).read() 
    soup = BeautifulSoup(html,"html.parser") 
    tags=soup.findAll('a') 
    url= tags[position-1].get('href') 
    count=count + 1 
    if count == rpt: 
     break 

print url 
0

这里是我的2美分:

import urllib 
#import ssl 
from bs4 import BeautifulSoup 
#'http://py4e-data.dr-chuck.net/known_by_Fikret.html' 
url = raw_input('Enter URL : ') 
position = int(raw_input('Enter position : ')) 
count = int(raw_input('Enter count : ')) 

print('Retrieving: ' + url) 
soup = BeautifulSoup(urllib.urlopen(url).read()) 

for x in range(1, count + 1): 
    link = list() 
    for tag in soup('a'): 
     link.append(tag.get('href', None))  
    print('Retrieving: ' + link[position - 1]) 
    soup = BeautifulSoup(urllib.urlopen(link[position - 1]).read()) 
+0

更高效的答案出现在这里:https://stackoverflow.com/questions/38267954/following-links -in-python的赋值 - 使用 - beautifulsoup/46653848#46653848 –