Как изолировать результаты синтаксического анализа только с одной до двух цифр в Python с BeautifulSoup - PullRequest
2 голосов
/ 10 апреля 2019

Продолжая свою программу FreshDirect, я рассчитываю получить значения количества, которое у меня есть в моих постоянных заказах. Мне нужно получить эти значения, чтобы в конечном итоге автоматизировать процесс заказа, но сейчас я застрял на этом. Есть ли способ получить только значения количества предметов?

То, что я пытался сделать, это анализировать теги input в HTML. Затем я использовал re.sub, чтобы попытаться выделить цифры. Я все еще получаю целую кучу значений, включая буквы. Для справки, HTML-код, который я ищу, выглядит следующим образом:

<input id="qty_cartline_change_-1313013247" class="qty" type="text" name="qty" value="1" maxlength="4" data-component="quantitybox.value" data-productdata-name="quantity">
def get_values():
    for items in inputs:
        standing_order_value = str(items.get('value'))
        print(standing_order_value)
        for node in standing_order_value:
            re.sub(r'\D', '', node)
        current_value = {'Quantity':standing_order_value}
        print(current_value)

Я ожидаю, что он просто возьмет число рядом с "value =" (это будет 1) для всех предметов, которые я имею в инвентаре. Теперь я могу получить эти цифры, но я также получаю много дополнительных средств, и я не уверен, почему.

What I get that is good: 1
{'Quantity': '1'}
1
{'Quantity': '1'}
1
{'Quantity': '1'}
1
{'Quantity': '1'}
1
{'Quantity': '1'}
1
{'Quantity': '1'}
1
What I get that I don't want: 
atc_a200237b-8c88-4611-8582-3d8dd3eba7c5
{'Quantity': 'atc_a200237b-8c88-4611-8582-3d8dd3eba7c5'}
gro_pid_4010985
{'Quantity': 'gro_pid_4010985'}
/pdp.jsp?productId=gro_pid_4010985&catId=gro_snack_nubars&variantId=dyf_scr_ord1
{'Quantity': '/pdp.jsp?productId=gro_pid_4010985&catId=gro_snack_nubars&variantId=dyf_scr_ord1'}
gro_snack_nubars
{'Quantity': 'gro_snack_nubars'}
dyf_scr_ord1
{'Quantity': 'dyf_scr_ord1'}
GRO4010985
{'Quantity': 'GRO4010985'}
EA
{'Quantity': 'EA'}
EA

1 Ответ

1 голос
/ 10 апреля 2019

Если вы используете BeautifulSoup, вы можете использовать атрибуты = значение селекторов

soup = BeautifulSoup(your_html, 'lxml')
values = [item['value'] for item in soup.select("input[value]")]

Вы можете посмотреть, какая комбинация селекторов дает наилучшие результаты.Выше я добавил атрибут value, чтобы тег input имел атрибут value, но, вероятно, вы можете использовать следующее, чтобы убедиться, что это тег количества input.Вы можете предположить, что есть атрибут value.

values = [item['value'] for item in soup.select("input[data-productdata-name=quantity]")]

Не предполагая, что есть атрибут value и указание должно быть:

values = [item['value'] for item in soup.select("input[value][data-productdata-name=quantity]")]

Это может быть самым надежным.


Если вы уверены, что пара productdata-name=quantity атрибут = значение встречается только для количественных входных значений с атрибутами значения, то это будет выполняться быстрее:

values = [item['value'] for item in soup.select("[data-productdata-name=quantity]")]

Единственная версия первого матча:

value = soup.select_one("[data-productdata-name=quantity]")['value']

Пример:

from bs4 import BeautifulSoup

html = '''<input id="qty_cartline_change_-1313013247" class="qty" type="text" name="qty" value="1" maxlength="4" data-component="quantitybox.value" data-productdata-name="quantity">'''

soup = BeautifulSoup(html, 'lxml')
values = [item['value'] for item in soup.select("input[value]")]
print(values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...