Как удалить опцию, выбранную с помощью bs4? - PullRequest
0 голосов
/ 29 августа 2018

Моя идея этого сценария состоит в том, чтобы создать сценарий, который печатает следующее

4,5 5,5 6 7 8,5 9 10

с использованием следующего HTML:

<select name="id" style="display: none;">
   <option value="-1" class="selected">
      Choose number
   </option>
   <option value="5011265">
      4,5
   </option>
   <option data-alt="1 kvar" value="5012834">
      5,5
   </option>
   <option value="5011266">
      6
   </option>
   <option value="5011267">
      7
   </option>
   <option data-alt="1 kvar" value="5011269">
      8,5
   </option>
   <option value="5011270">
      9
   </option>
   <option value="5011271">
      10
   </option>
</select>

Мне удалось распечатать, используя

nosto_sku_tags = bs4.find_all('select', {'name': 'id'})

    product_skus = []
    for nosto_sku_tag in nosto_sku_tags:

        try:
            sku_size = nosto_sku_tag
            print(sku_size)

        except Exception:
            sku_size = None

Однако распечатка, которую я получаю:

Выберите номер 4,5 5,5 6 7 8,5 9 10

и я понятия не имею, как я могу продолжить работу над своим кодом, чтобы он печатал только все числа, но не первое число, которое Choose number.

Как я могу сделать код, чтобы он печатал только цифры без Choose number?

Результат распечатки при печати прямо сейчас:

<select name="id">
   <option value="-1">
      Choose number
   </option>
   <option value="5011265">
      4,5
   </option>
   <option data-alt="1 kvar" value="5012834">
      5,5
   </option>
   <option value="5011266">
      6
   </option>
   <option value="5011267">
      7
   </option>
   <option data-alt="1 kvar" value="5011269">
      8,5
   </option>
   <option value="5011270">
      9
   </option>
   <option value="5011271">
      10
   </option>
</select>

1 Ответ

0 голосов
/ 29 августа 2018

Если под «выбранным» вы имеете в виду, что первый имеет класс selected , вы можете просто проверить это:

nosto_sku_tags = bs4.select('select[name="id"] option')
for nosto_sku_tag in nosto_sku_tags:
    if 'selected' in nosto_sku_tag.get('class', ()):
        continue
    sku_size = nosto_sku_tag.get_text(strip=True)

(в этом случае нет необходимости использовать обработку исключений, все теги имеют метод get_text()).

Поскольку атрибут class может быть отсутствует , вам нужно использовать .get('class', ()), чтобы вместо этого получить пустой кортеж.

Обратите внимание, что я использовал другой запрос , чтобы найти элементы <option>, которые вы разместили в HTML. Ваш код печатает элемент <select> как один большой объект, а не отдельные элементы <option> под ним. Вместо того, чтобы использовать отдельный поиск для элемента <select> и затем содержащихся элементов <option>, я использовал CSS-селектор , чтобы напрямую перейти к параметрам.

Код селектора BeautifulSoup CSS не так уж и сложен, поэтому мы не можем использовать селектор :not(.selected) psuedo, чтобы отфильтровать этот вариант.

Демо-версия:

>>> nosto_sku_tags = soup.select('select[name="id"] option')
>>> for nosto_sku_tag in nosto_sku_tags:
...     if 'selected' in nosto_sku_tag.get('class', ()):
...         continue
...     sku_size = nosto_sku_tag.get_text(strip=True)
...     print(sku_size)
...
4,5
5,5
6
7
8,5
9
10

Если в элементах <option> есть класс no , а также нет атрибута selected, то вам придется придумать свою собственную эвристику. По умолчанию элемент first отображается в браузере, поэтому мы можем просто пропустить его:

for nosto_sku_tag in nosto_sku_tags[1:]:
    sku_size = nosto_sku_tag.get_text(strip=True)

Обратите внимание на срез [1:].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...