2015-12-20 3 views
1

Я пытаюсь создать веб-браузер, который анализирует весь 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

Я не полностью понимания вход. URL-адрес довольно ясен. Но почему позиция и счет? Кроме того, почему вы хотите повторить весь процесс несколько раз? Вам не нужно просто захватывать все URL-адреса на странице? Обычно вам просто нужно загрузить страницу один раз и получить все теги. Можете ли вы уточнить? – DJanssens

+0

Извините, если я был неясен, я хочу, чтобы веб-браузер получал ссылку на веб-странице, например, если пользователь вводит «позицию» как 3, а «счет» - 4, он захватывает третью ссылку, а затем вводит ее ссылку на urllib, разобрать эту ссылку, захватить третью ссылку на этой странице и цикл 4 раза, как указано в «счете». –

+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 

Код теперь будет удален p количество раз, как указано на входе, каждый раз, когда он примет значение href в данной позиции и заменит его на url, таким образом, каждый цикл будет выглядеть далее в древовидной структуре .

Я советую вам использовать полные имена для переменных, что намного легче понять. Кроме того, вы можете бросить их и прочитать их в одной строке, что упростит ваше начало.

+0

Я ценю, что вы тратите время, чтобы попытаться помочь мне, но это не то, что я ищу. Это добавляет ссылки на список, а затем печатает некоторые из указанных ссылок. То, что я хочу сделать, это использовать одну из ссылок на странице как точку перехода в качестве сортировки. Таким образом, искатель будет брать одну из ссылок через 'tag.get ('href')', вставить его в открыватель файла 'urllib.urlopen (url) .read', а затем проанализировать эту страницу, захватить ссылку, повторно вставить один в открыватель файла, и повторите это определенное количество раз. Не уверен, что я сделал это яснее, извините, если я не имею смысла. –

+0

Ага получил его, но я немного озадачен параметрами.Таким образом, позиция указывает, какая ссылка на странице должна быть возвращена, и подсчет указывает, сколько раз процесс должен повторяться, каждый раз, когда он глубже проникает в дерево url и берет ветку 3? – DJanssens

+0

Да, это хороший способ объяснить это. Однако я понял в исходном коде, что нет внутреннего цикла для прерывания после первой итерации, потому что счетчик всегда будет больше, чем указанный пользователем номер после первой итерации. Однако даже при фиксированной внутренней петле внешний контур не будет нарушен –

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/followinglink -в-питон-присвоение с использованием-BeautifulSoup/46653848 # 46653848 –

Смежные вопросы