Запросите несколько URL-адресов в скрипте Python - PullRequest
2 голосов
/ 13 мая 2019

Я создаю веб-скребок и пытаюсь запросить несколько URL-адресов, которые используют один и тот же путь URL-адреса, за исключением нумерованного идентификатора.

Мой код для очистки одного URL выглядит следующим образом:

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://beta.companieshouse.gov.uk/company/00930291/officers')
soup = bs(r.content, 'lxml')
names = [item.text.strip() for item in soup.select('[class^=appointment]:not(.appointments-list):has([id^="officer-role-"]:contains(Director)) h2')]
print(names)

URL-адрес имеет ту же структуру, за исключением номеров компаний. Я попробовал следующий код, чтобы попытаться очистить несколько страниц, но безуспешно:

import requests
from bs4 import BeautifulSoup as bs

pages = []

for i in range(11003058, 11003059, 00930291):
```url = 'https://beta.companieshouse.gov.uk/company/' + str(i) + '/officers'
```pages.append(url)

for item in pages:
```page = requests.get(item)
```soup = bs(page.text, 'lxml')

names = [item.text.strip() for item in soup.select('[class^=appointment]:not(.appointments-list):has([id^="officer-role-"]:contains(Director)) h2')]

print(names)

Это дает мне только первую страницу (/ 11003058 / офицеры), почему она не проходит через них? Кто-нибудь может помочь?

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Это должно решить ваши проблемы:

Функция range () возвращает последовательность чисел, начиная с 0 по умолчанию и увеличивая на 1 (по умолчанию), и заканчивая указанным номером.

Синтаксис:

 range(start, stop, step)

https://docs.python.org/3/library/functions.html#func-range

Замените ваш код на:

company_id = ["11003058","11003059","00930291"]

for i in company_id:
    url = 'https://beta.companieshouse.gov.uk/company/' + str(i) + '/officers'
    pages.append(url)

Вы должны инициализировать soup как списокдо итерации страниц:

soup = []

и добавить в список супов:

for item in pages:
  page = requests.get(item)
  soup.append(bs(page.text, 'lxml'))

список печати имен:

names = []
for items in soup:
    h2Obj = items.select('[class^=appointment]:not(.appointments-list):has([id^="officer-role-"]:contains(Director)) h2')
    for i in h2Obj:
        tagArray = i.findChildren()
        for tag in tagArray:
            if isinstance(tag,Tag) and tag.name in 'a':
                names.append(tag.text)

O / P:

['MASRAT, Suheel', 'MARSHALL, Jack', 'SUTTON, Tim', 'COOMBES, John Frederick', 'BROWN, Alistair Stuart', 'COOMBES, Kenneth', 'LAFONT, Jean-Jacques Mathieu', 'THOMAS-KEEPING, Lindsay Charles', 'WILLIAMS, Janet Elizabeth', 'WILLIAMS, Roderick', 'WRAGG, Barry']

Добавить начало скрипта:

из тега импорта bs4.element

0 голосов
/ 13 мая 2019

Диапазон в циклах: цикл всегда включает start_value и исключает end_value во время итерации

Попробуйте это:

import requests
from bs4 import BeautifulSoup as bs

pages = ['11003058', '11003059', '00930291']
i=0
while i<len(pages):
  url = 'https://beta.companieshouse.gov.uk/company/' + pages(i) + '/officers'
  pages.append(url)
  i+1

for item in pages:
  page = requests.get(item)
  soup = bs(page.text, 'lxml')

names = [item.text.strip() for item in soup.select('[class^=appointment]:not(.appointments-list):has([id^="officer-role-"]:contains(Director)) h2')]

print(names)
0 голосов
/ 13 мая 2019

Синтаксис для range: range(start, stop, step).Он увеличивается от start до stop - 1 и увеличивается на step каждый раз.Вы делаете здесь что-то странное, потому что в вашем случае stop равно start + 1, поэтому он будет зацикливаться только один раз со значением start.

Полагаю, вы просто хотите получить эти 3 URL:

for i in (11003058, 11003059, 00930291):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...