Python & Beautifulsoup 4 - findAll не получает все элементы, только получает первый? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь получить информацию о размерах обуви с сайта KicksUSA.com и, похоже, не могу получить размеры обуви, отображаемые на страницах продукта. Принимая эту страницу в качестве примера - https://www.kicksusa.com/jordan/air-jordan-13-retro-atmosphere-greyblack-white-univ-red-414571-016.html - я пытаюсь получить все размеры, отображаемые там.

Размеры появляются в 3 местах, которые я заметил -

  1. Как data-label атрибуты a элементов в элементе div.input-box.validation-passed (или, если мы пойдем на один элемент выше, в элементе dd.last)
  2. Как option элементы с price, равным 0 внутри select элемента
  3. В пределах spConfig JS код

Любая попытка получить данные из первого местоположения (data-label атрибуты a элементов) приводила к None.

Когда я использовал следующий код:

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
getgetsize = str([e.get_text() for e in getsize.findAll('option', attrs={'price': '0'})])

Я ничего не получаю, как если бы option элементов с этим атрибутом не существовало.

Когда я запускаю этот код:

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
getgetsize = str([e.get_text() for e in getsize.findAll('option')])

Я получаю только первый результат, Choose an Option...

У кого-нибудь есть идеи, как получить данные, которые мне нужны? Заранее спасибо.

РЕДАКТИРОВАТЬ: Это фрагмент, который обходит защиту:

        headers = {
            'Host': 'www.kicksusa.com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/72.0.3626.121 Safari/537.36',
            'DNT': '1',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
            'Cookie': 'visid_incap_459049=Evije6RoRAG1GuxEpbckJA4Ch1wAAAAAQUIPAAAAAABk8hUjgpv63FQ2WQOlcukw; incap_ses_1079_459049=UXVgNfGObEuAWEiyCWH5DiGJm1wAAAAA4XovM6FTnjT4ZWyukyoWxw==',
        }
        data2 = requests.get(url3, headers=headers)
        soup2 = BeautifulSoup(data2.text, 'html.parser')

Вы должны отредактировать значения visid_incap_...=... и incap_ses_...=..., открыв kicksusa.com и перейдя в Cookies-> kicksusa.com

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я все время пытался взять кровь из камня. Данные, которые я искал, просто отсутствуют - веб-сайт выполняет некоторые манипуляции с JS DOM. Единственный способ сделать это (насколько я знаю) - это получить код spConfig JS и использовать регулярные выражения для получения данных оттуда. Теперь я собираюсь поиграть с regex, спасибо всем за идеи и помощь!

0 голосов
/ 27 марта 2019

С помощью findAll () вы получаете несколько групп, и вам нужно получить к ним доступ через e.group (0):

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
for e in getsize.findAll('option')]):
      l = len(e)
      for i in l:
            getgetsize[i] = str(e.group(i).get_text()) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...