如何使用BeautifulSoup在Python中仅使用一到两位数字隔离分析结果

时间:2019-04-09 21:47:10

标签: html python-3.x web-scraping beautifulsoup

在继续执行FreshDirect程序时,我希望获得常规订单中所含数量的值。我需要获取这些值才能最终使订购过程自动化,但是现在这就是我所坚持的。有没有办法只获取物品数量的值?

我试图做的是通过HTML中的“ input”标签进行解析。然后,我使用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)旁边的数字 我库存中的所有物品。现在,我能够获得这些数字,但我也能获得很多额外的好处enter code here,但我不确定为什么。

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 个答案:

答案 0 :(得分:1)

如果使用BeautifulSoup,则可以使用attribute =值选择器

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)