Web Scraping ссылки с ранее найденной ссылки - PullRequest
1 голос
/ 30 апреля 2020

Я перебираю веб-сайт, который содержит открытые Рождественские елки в Соединенных Штатах. Моя конечная цель - получить телефонные имена, номера, адрес и электронную почту для каждой фермы. Несмотря на то, что это моя конечная цель, я пока что не кодировал, поэтому, пожалуйста, помогите мне только там, где я застрял. Я также хотел бы придерживаться своего кода как можно ближе, чтобы я мог его понять (я очень новичок в этом), но, конечно, благодарен за другие предложения.

Сначала я захватил домашний веб-сайт, где есть таблица состояний со встроенными ссылками. Мне удалось собрать все эти ссылки здесь, в моем первом блоке кода. Внутри штатов есть карта, которая показывает каждый округ (с другой встроенной ссылкой). Я сейчас пытаюсь захватить каждую из этих ссылок. Мне удалось сделать одно состояние с чем-то похожим на мой первый показанный блок кода, но я хочу выполнить l oop, чтобы исключить ненужный / повторяющийся код. Я попытался создать al oop, но я получаю сообщение об ошибке в отношении моей команды .text. Я предположил, что каждая ссылка, которую я беру, должна иметь .text в конце, как у моей переменной source. Поэтому я попытался добавить его, но, очевидно, есть проблема. Любые предложения?

enter image description here

enter image description here

source = requests.get('http://www.pickyourownchristmastree.org/').text
soup = BeautifulSoup(source, 'lxml')
concatenate = 'http://www.pickyourownchristmastree.org/'

find_state_group = soup.find('div', class_ = 'alert')
for link in find_state_group.find_all('a', href=True):
    if 'xmastrees' in link['href']:
        states = concatenate + link['href']

i = 1
for source_state in states:
    source_state = states[-1 + i:]
    x = source_state().text
    soup_state = BeautifulSoup(x, 'lxml')
    state_county = soup_state.find('div', class_='alert')
    for county_link in state_county.find_all('area', href=True):
        if '.php' in county_link['href']:
            county_link_update = concatenate + county_link['href']
            print(county_link_update)
    i = i + 1
    x = source_state().text
TypeError: 'str' object is not callable

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

На основании вашего ответа на мой комментарий я изменил ваше решение с небольшими изменениями. Вы должны быть в состоянии следовать этой логике c для получения и перехода к каждой ссылке на вашей карте.

  1. Я создал пустой список state_links в начале.
    • Для каждой найденной ссылки состояния я добавляю ее в этот список.
  2. Для каждой ссылки состояния в state_links мы делаем новый запрос на получение текстового содержимого эта страница.

import requests
from bs4 import BeautifulSoup

source = requests.get('http://www.pickyourownchristmastree.org/').text
soup = BeautifulSoup(source, 'html.parser')
concatenate = 'http://www.pickyourownchristmastree.org/'
state_links = []
ab = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 'HI', 'ID','IL', 'IN', 'IA', 'KS', 'KY', 'LA',
          'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK',
          'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']
ab = [x + "xmastrees.php" for x in ab]
find_state_group = soup.find('div', class_ = 'alert')
links = find_state_group.find_all('a', href=True)
for link in links:
    if link['href'] in ab:
        states = concatenate + link['href']
        state_links.append(states)
print(state_links)

for link in state_links:
    source = requests.get(link).text
    soup = BeautifulSoup(source, 'html.parser')
    area_links = soup.find_all('area', href=True)
    area_links = [concatenate + x['href'] for x in area_links]
    print(area_links)
0 голосов
/ 30 апреля 2020
import requests
from bs4 import BeautifulSoup

source = requests.get('http://www.pickyourownchristmastree.org/').text
soup = BeautifulSoup(source, 'html.parser')
concatenate = 'http://www.pickyourownchristmastree.org/'
state_links = []
ab = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 'HI', 'ID','IL', 'IN', 'IA', 'KS', 'KY', 'LA',
          'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK',
          'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']
ab = [x + "xmastrees.php" for x in ab]

find_state_group = soup.find('div', class_ = 'alert')
links = find_state_group.find_all('a', href=True)
for link in links:
    if link['href'] in ab:
        states = concatenate + link['href']
        state_links.append(states)
print(state_links)
i = 1
for source_state in state_links:
    source_state = states[-1 + i:]
    x=requests.get(source_state).text
    soup_state = BeautifulSoup(x, 'lxml')
    state_county = soup_state.find('div', class_='alert')
    for county_link in state_county.find_all('area', href=True):
        if '.php' in county_link['href']:
            county_link_update = concatenate + county_link['href']
            print(county_link_update)
    i = i + 1
0 голосов
/ 30 апреля 2020

Вот что я пробовал, но получаю ошибку, которую не могу исправить.

source = requests.get('http://www.pickyourownchristmastree.org/').text
soup = BeautifulSoup(source, 'lxml')
concatenate = 'http://www.pickyourownchristmastree.org/'
state_links = []
ab = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 'HI', 'ID','IL', 'IN', 'IA', 'KS', 'KY', 'LA',
          'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK',
          'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']
print(ab[1])
j = 1
find_state_group = soup.find('div', class_ = 'alert')
for link in find_state_group.find_all('a', href=True):
    for y in ab:
        y = ab[-1 + j:]
        if y in link['href']:
            states = concatenate + link['href']
            state_links.append(states)
        j = j + 1
print(state_links)
    if y in link['href']:
TypeError: 'in <string>' requires string as left operand, not list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...