2017-02-19 30 views
1

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

Я определил, какие разделы сайта содержат URL-адреса, которые мне нужны, и знаю/думаю, что мне нужны 2 списка, чтобы делать то, что я хочу.

Первый, это список адресов для городов, второй - список URL-адресов для единиц внутри этих цитат. Это URL-адреса единиц, которые я в конечном счете хочу перебрать и удалить данные. До сих пор у меня есть следующий код:

def get_cities(): 
    city_sauce = urllib.request.urlopen('the_url') 
    city_soup = BeautifulSoup(city_sauce, 'html.parser') 
    the_city_links = [] 
    for city in city_soup.findAll('div', class_="city-location-menu"): 
     for a in city.findAll('a', href=True, text=True): 
       the_city_links.append('first_half_of_url' + a['href']) 
    return the_city_links 

Когда я распечатать это он показывает все URLs мне нужно, поэтому я думаю, что мы успешно создали список ссылок здесь?

Вторая часть следующим образом:

def get_units(): 
    for theLinks in get_cities(): 
     unit_sauce = urllib.request.urlopen(theLinks) 
     unit_soup = BeautifulSoup(unit_sauce, 'html.parser') 
     the_unit_links = [] 
     for unit in unit_soup.findAll('div', class_="btn white-green icon-right-open-big"): 
      for aa in unit.findAll('a', href=True, text=True): 
       the_unit_links.append(aa) 
     return the_unit_links 

При печати это просто возвращает []. Я не уверен, где я ошибаюсь, любая помощь будет оценена!

Часть 2 редакции:

def get_units(): 
    for the_city_links in get_cities(): 
     unit_sauce = urllib.request.urlopen(the_city_links) 
     unit_soup = BeautifulSoup(unit_sauce, 'html.parser') 
     the_unit_links = [] 
     for unit in unit_soup.findAll('div', class_="btn white-green icon-right-open-big"): 
      for aa in unit.findAll('a', href=True, text=True): 
       the_unit_links.append(aa) 
     return the_unit_links 
+1

Вам необходимо предоставить какой канал связи вы пытаетесь принести? Может быть, вы отсутствуете, чтобы получить что-то или, может быть, вы выбираете неправильный класс. –

+0

Я поместил url в 'city_sauce', я надеялся, что' unit_sauce' возьмет каждую из этих ссылок, которые хранятся в списке, проанализируйте их в 'unit_soup', а затем зайдите в каждую из ссылок и возьмите hrefs в '' div ', class _ = "btn white-green icon-right-open-big" ', а затем добавьте их в список' the_unit_links', который затем будет повторяться в моем скрепе. Есть идеи? @ PiyushS.Wanare Я немного изменил вторую часть, см. Ревизию. – Maverick

+0

Это будет лучше, если вы поместите данные в одну функцию. –

ответ

1
# Crawls main site to get a list of city URLs 
def getCityLinks(): 
    city_sauce = urllib.request.urlopen('the_url') 
    city_soup = BeautifulSoup(city_sauce, 'html.parser') 
    the_city_links = [] 

    for city in city_soup.findAll('div', class_="city-location-menu"): 
     for a in city.findAll('a', href=True, text=True): 
      the_city_links.append('the_url' + a['href']) 
    #print(the_city_links) 
    return the_city_links 

# Crawls each of the city web pages to get a list of unit URLs 
def getUnitLinks(): 
    getCityLinks() 
    for the_city_links in getCityLinks(): 
     unit_sauce = urllib.request.urlopen(the_city_links) 
     unit_soup = BeautifulSoup(unit_sauce, 'html.parser') 
     the_unit_links = [] 
     for unit_href in unit_soup.findAll('a', class_="btn white-green icon-right-open-big", href=True): 
      the_unit_links.append('the_url' + unit_href['href']) 
     yield the_unit_links 
2

Предполагая, что я понимаю, как вы используете это - ваша функция будет возвращать после первой ссылки в get_cities(), которые могут не иметь единиц? Я думаю, вам нужно установить the_unit_links = [] в начале функции, а затем переместить линию возврата функции в один отступ - так что она будет возвращена только после того, как будут очищены все ссылки в get_cities.

+0

Благодарим за это предложение, к сожалению, что вернуло []! – Maverick

1
def getLinks(): 
    city_sauce = urllib.request.urlopen('the_url') 
    city_soup = BeautifulSoup(city_sauce, 'html.parser') 
    the_city_links = [] 

    for city in city_soup.findAll('div', class_="city-location-menu"): 
      for a in city.findAll('a', href=True, text=True): 
        the_city_links.append('first_half_of_url' + a['href']) 
     #return the_city_links 

    # print the_city_links 

    for the_city_links in the_city_links: 
     unit_sauce = urllib.request.urlopen(the_city_links) 
     unit_soup = BeautifulSoup(unit_sauce, 'html.parser') 
     the_unit_links = [] 
     for unit in unit_soup.findAll('div', class_="btn white-green icon-right-open-big"): 
      for aa in unit.findAll('a', href=True, text=True): 
       the_unit_links.append(aa) 
     return the_unit_links 

Примечание: -Print the_city_links и проверка вы получаете ожидаемый выход, а затем запустить еще один цикл на то, чтобы принести это соответствующий unit_links