Извлечение строки, удовлетворяющей условию, из URL-адреса, который может измениться

#python #parsing #url #extract

#python #Синтаксический анализ #url #извлечь

Вопрос:

Я просматриваю список веб-ссылок и очищаю базовый URL-адрес. Иногда извлеченный URL-адрес имеет такую структуру:

      http://www.amazon.com/dp/B07DLTSZVP?tag=snag04-20
  

в других случаях извлеченный URL-адрес будет выглядеть следующим образом:

       https://www.amazon.com/s?field-asin=B01NCZM14Camp;rh=i:aps,ssx:relevanceamp;field-keywords=best minimalist wallet
  

В каждом случае я просто хочу, чтобы внутри каждого URL-адреса была строка из 10 цифр, начинающаяся с заглавной буквы «B» (т. Е. «B07DLTSZVP» или «B01NCZM14C»).

Я включил инструкции if, elif и else в свой цикл для извлечения этой конкретной строки, в зависимости от того, выглядит ли извлеченный URL-адрес как в первом или втором приведенном выше случае (это всегда будут только эти два случая), но это не работает. Мой код просто извлекает весь URL-адрес без его синтаксического анализа на основе моих инструкций if. Спасибо за любую помощь в решении. Вот мой код:

 list = []

for index, row in filtereddf3.iterrows():

url = row[' href']
driver = webdriver.Firefox()
driver.get(url)

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

if soup.find('a', attrs={'id': 'view-amazon'}) is None:
    zero = 1 
elif '-asin=' in soup.find('a', attrs={'id': 'view-amazon'})['href']:     
    zero = soup.find('a', attrs={'id': 'view-amazon'})['href']
    zero[zero.find("=") 1:zero.find("amp;rh=")]     

else:
    zero = soup.find('a', attrs={'id': 'view-amazon'})['href']
    zero[zero.find("dp/") 3:zero.find("?tag")]


df = pd.DataFrame({'asin': zero}, index=[0])
time.sleep(3)
list.append(df)
final_list = pd.concat(list)
  

Комментарии:

1. zero[zero.find("=") 1:zero.find("amp;rh=")] это просто выражение. Я полагаю, вы хотите назначить это zero ? zero = zero[zero.find("=") 1:zero.find("amp;rh=")]

2. О боже. Спасибо, что подчеркнули очевидное.

3. можете ли вы указать URL-адрес на случай, если есть другие способы?

Ответ №1:

Вы могли бы использовать простое регулярное выражение

 Bw{9}
  

Смотрите демонстрацию на regex101.com .