У меня есть такое выражение:
<a class = "a-link-normal" href = "https://www.amazon.it/Philips-GC8735-PerfectCare-Generatore-Vapore/dp/B01J5FGW66/ref=gbph_img_s-3_7347_c3de3e94?smid=A11IL2PNWYJU7H&pf_rd_p=82ae57d3-a26a-4d56-b221-3155eb797347&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A11IL2PNWYJU7H&pf_rd_r=MDQJBKEMGBX38XMPSHXB" id = "dealImage"></a>
И мне нужно получить 10 букв рядом с "/ dp /" (B01J5FGW66)
Как я могу сделать функцию, которая это сделает?
Использование регулярного выражения:
import re
s = '<a class = "a-link-normal" href = "https://www.amazon.it/Philips-GC8735-PerfectCare-Generatore-Vapore/dp/B01J5FGW66/ref=gbph_img_s-3_7347_c3de3e94?smid=A11IL2PNWYJU7H&pf_rd_p=82ae57d3-a26a-4d56-b221-3155eb797347&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A11IL2PNWYJU7H&pf_rd_r=MDQJBKEMGBX38XMPSHXB" id = "dealImage"></a>'
print(re.search(r"dp/([A-Za-z0-9]{10})/", s)[1])
Выход: B01J5FGW66
Объяснение:
начинаются с "dp/"
:
dp/
группа захвата, разделенная () соответствующими 10 (до {10}) строчными буквами (a-z), заглавными буквами (A-Z) и цифрами (0-9):
([A-Za-z0-9]{10})
конец на "/"
:
/
Используя re.search
, мы можем найти это выражение в вашей строке s
и получить доступ к результатам для 1-й группы захвата с помощью [1]
.
Примечание, что вы можете добавить дополнительный код на случай, если совпадение не будет найдено:
m = re.search(r"dp/([A-Za-z0-9]{10})/", s)
if m is not None:
print(m[1])
else:
# if nothing is found, search return None
print("No match")
Какой тип переменной вы передаете search
в качестве второго аргумента
тип <класс 'bs4.element.Tag'>, как я могу решить эту проблему?
Попробуйте добавить ["href"]
Что вы имеете в виду под словом «добавить»? У меня есть переменная, содержащая царапины на странице, как я могу «добавить»?
если ваша переменная была названа s
, попробуйте re.search(r"dp/([A-Za-z0-9]{10})/", s["href"])
там написано TypeError: 'NoneType' object is not subscriptable
Я предполагаю, что вам всегда нужно только то, что находится между косой чертой рядом с dp (следующий маршрут), и что 10 символов не имеют значения. Немного неуклюже, но это работает:
>>> x = '<a class = "a-link-normal" href = "https://www.amazon.it/Philips-GC8735-PerfectCare-Generatore-Vapore/dp/B01J5FGW66/ref=gbph_img_s-3_7347_c3de3e94?smid=A11IL2PNWYJU7H&pf_rd_p=82ae57d3-a26a-4d56-b221-3155eb797347&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A11IL2PNWYJU7H&pf_rd_r=MDQJBKEMGBX38XMPSHXB" id = "dealImage"></a>'
>>> splits = x.split("/")
>>> dp_index = splits.index('dp')
>>> result = splits[dp_index+1] # Get the next one over
>>> result
'B01J5FGW66'
чтобы поместить его в функцию, вы можете сделать это так:
def get_route_next_to_dp(html_str):
splits = html_str.split("/")
dp_index = splits.index('dp')
result = splits[dp_index+1] # Get the next one over
return result
Использование может выглядеть так:
html_str = '<a class = "a-link-normal" href = "https://www.amazon.it/Philips-GC8735-PerfectCare-Generatore-Vapore/dp/B01J5FGW66/ref=gbph_img_s-3_7347_c3de3e94?smid=A11IL2PNWYJU7H&pf_rd_p=82ae57d3-a26a-4d56-b221-3155eb797347&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A11IL2PNWYJU7H&pf_rd_r=MDQJBKEMGBX38XMPSHXB" id = "dealImage"></a>'
route_next_to_dp = get_route_next_to_dp(html_str)
print(route_next_to_dp)
выходы
'B01J5FGW66'
по желанию.
Попробуйте это: он в основном использует регулярное выражение и подсчитывает следующие 10 строк и проверяет, найдено ли оно.
import re
my_string='<a class = "a-link-normal" href = "https://www.amazon.it/Philips-GC8735-PerfectCare-Generatore-Vapore/dp/B01J5FGW66/ref=gbph_img_s-3_7347_c3de3e94?smid=A11IL2PNWYJU7H&pf_rd_p=82ae57d3-a26a-4d56-b221-3155eb797347&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A11IL2PNWYJU7H&pf_rd_r=MDQJBKEMGBX38XMPSHXB" id = "dealImage"></a>'
m = re.search(r"dp/([A-Za-z0-9]{10})/", my_string)
if m.group(1):
print(m.group(1))
Большое спасибо, я все понимаю, но у меня последняя ошибка: return _compile (шаблон, флаги) .search (строка) TypeError: ожидаемая строка или байтовый объект Я пробовал использовать str (), но не работает