2016-03-28 2 views
1

Я довольно новичок в этом и создаю сценарий, чтобы научиться царапать. Я запрашиваю главную страницу индекса для списка URL-адресов, которые затем содержат контактную информацию, которую я хочу.Запуск через множество остановок после первого запуска - Python

Я успешно получаю индексный список в набор, а затем пытаюсь выполнить итерацию с помощью двух функций (я уверен, что есть лучший способ сделать это). После первой итерации она останавливается, и я просто не понимаю, почему. Любые указатели оценили.

import requests 
from bs4 import BeautifulSoup 

linkset = set() 
url = "http://someurl.com/venues" 
r = requests.get(url) 
soup = BeautifulSoup(r.content, "lxml") 

base_url = "http://someurl.com/uk/" 
links = soup.find_all("a", class_="supplier-link") 


# A function to get the links from the top level directory. 
def get_venue_link_list(links): 
    for link in links: 
     linkset.add(link.get("href")) 
     return linkset 

#get_venue_link_list(links) 
# When I test by printing linkset, I get the list of unique URL's. 
# This works as expected. 
#print linkset 

# A function to go retrieve contact 

def go_retrieve_contact(link_value): 
    for i in link_value: 
     link = i 
     venue_link = base_url + link 
     venue_request = requests.get(venue_link) 
     venue_soup = BeautifulSoup(venue_request.content, "lxml") 
     info = venue_soup.find_all("section", {"class": "findout"}) 
     header = venue_soup.find_all("div", {"id": "supplier-header-desktop"}) 
     go_get_info(info) 
# Email, Phone and Website was nested in one div so it was a little easier to get. 
# Will need to use a different div for address and social media names. 

def go_get_info(info): 
    for item in info: 
     print "%s" % ((item.contents[3].find_all("span", {"class": "text"})[0].text)).strip() 
     print "%s" % ((item.contents[3].find_all("span", {"class": "text"})[1].text)).strip() 
     print "%s" % ((item.contents[3].find_all("span", {"class": "text"})[2].text)).strip() 
     #Lets comment out this next nested loop until I fix the above. 
     #for item in header: 
      #print item.contents[1].text 

go_retrieve_contact(get_venue_link_list(links)) 

ответ

2

return заставляет функцию полностью выйти из системы. Как вы его написали, вы сказали функции вернуться сразу после первой итерации, поэтому неудивительно, что она останавливается. :)

Это вопрос отступов - то, что вы действительно хотите:

def get_venue_link_list(links): 
    for link in links: 
     linkset.add(link.get("href")) 
    return linkset 

Это позволяет закончить петли первого и затем выход.

2

Это потому, что вы не даете ему изменений для продолжения итерации. Вы находитесь в цикле return, поэтому он не попадает на вторую итерацию. Вам нужно не-отступом, что линия:

def get_venue_link_list(links): 
    for link in links: 
     linkset.add(link.get("href")) 
    return linkset 
2

В get_venue_link_list() вас есть оператор возврата внутри цикла. Это приводит к тому, что функция выходит из первого раза, когда она достигнута, поэтому вы никогда не выходите за пределы первой итерации. Удалите отступ из последней строки этой функции.

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