Получить идентификаторы полей из формы Google, python BeautifulSoup - PullRequest
0 голосов
/ 10 июля 2020

Например, в такой форме Google: как создать список этих «идентификаторов полей»

var FB_PUBLIC_LOAD_DATA_ = [null,[null,[[831400739,"Product Title",null,0,[[1089277187,null,0]
]
]
,[2054606931,"SKU",null,0,[[742914399,null,0]
]
]
,[1620039602,"Size",null,0,[[2011436433,null,0]
]
]
,[445859665,"First Name",null,0,[[638818998,null,0]
]
]
,[1417046530,"Last Name",null,0,[[1952962866,null,0]
]
]
,[903472958,"E-mail",null,0,[[916445513,null,0]
]
]
,[549969484,"Phone Number",null,0,[[848461347,null,0

Это соответствующий раздел HTML ^

У меня пока есть код:

    from bs4 import BeautifulSoup as bs
    a = requests.get(url, proxies=proxies)
    soup = bs(a.text, 'html.parser')
    fields = soup.find_all('script', {'type': 'text/javascript'})
    form_info = fields[1]
    print(form_info)

, но он возвращает много нерелевантных данных, и если я не включу много разделов кода str.replace(), str.split(), я не вижу простого способа сделать этот. Это также было бы чрезвычайно беспорядочно.

Мне не нужно использовать BeautifulSoup, хотя это кажется очевидным способом go.

В приведенном выше примере мне понадобится список вроде:

[1089277187, 742914399, 2011436433, 638818998, 1952962866, 916445513, 848461347]

1 Ответ

1 голос
/ 10 июля 2020

Beautiful soup используется для запроса тегов HTML. Поэтому на пути извлечения данных из переменной JavaScript стоит использовать регулярное выражение. Вы можете найти совпадение на [[. Однако это вернет 831400739. Это можно исключить вручную после регулярного выражения, пропустив первый элемент.

import re

script = '''var FB_PUBLIC_LOAD_DATA_ = [null,[null,[[831400739,"Product Title",null,0,[[1089277187,null,0]
]
]
,[2054606931,"SKU",null,0,[[742914399,null,0]
]
]
,[1620039602,"Size",null,0,[[2011436433,null,0]
]
]
,[445859665,"First Name",null,0,[[638818998,null,0]
]
]
,[1417046530,"Last Name",null,0,[[1952962866,null,0]
]
]
,[903472958,"E-mail",null,0,[[916445513,null,0]
]
]
,[549969484,"Phone Number",null,0,[[848461347,null,0'''

match = re.findall('(?<=\[\[)(\d+)', script) 
# (?<= ) means to look for the following (but not include it in the results):
# \[\[ means find 2 square brackets characters. The backslash is used to tell regex to use the character [ and not the function.
# (\d+) means to match the start of a digit of any size (and return it in results)

results = [x for x in match[1:]] # Skip the first item, which is 831400739
print(results)

Это выведет:

['1089277187', '742914399', '2011436433', '638818998', '1952962866', '916445513', '848461347']

Вы можете преобразовать результаты в целые числа. Также, чтобы сделать код более надежным, вы можете удалить пробелы и новые строки перед вызовом функции регулярного выражения, например: formatted = script.replace(" ", "").replace('\n', '').replace('\r', '')

...