#html #python-3.x
#HTML #python-3.x
Вопрос:
У меня есть html-файл ‘links.html ‘, из этого html-файла я хочу извлечь href //www.medicineindia.org/medicine-brand — details/8414/capicare, который предназначен для строки CAPICARE. Как это сделать с помощью скрипта python
Код ‘links.html ‘ это :
<a itemprop="url" href="//www.medicineindia.org/medicine-brand-
details/12220/cholstig"><span itemprop="name">CHOLSTIG</span></a>
<a itemprop="url" href="//www.medicineindia.org/medicine-brand-
details/8414/capicare"><span itemprop="name">CAPICARE</span></a>
<a itemprop="url" href="//www.medicineindia.org/medicine-brand-
details/230/cyclozobid"><span itemprop="name">CYCLOZOBID</span></a>
<a itemprop="url" href="//www.medicineindia.org/medicine-brand-
details/6855/cinkona"><span itemprop="name">CINKONA</span></a>
Комментарии:
1. Что вы пробовали, что не сработало?
Ответ №1:
Вы могли бы выполнить эту задачу с помощью «простого» регулярного выражения, которое использует преимущества групп захвата (и не-захвата):
import re
html = ('<a itemprop="url" href="//www.medicineindia.org/medicine-brand'
'-details/12220/cholstig"><span itemprop="name">CHOLSTIG</span></a><a '
'itemprop="url" href="//www.medicineindia.org/medicine-brand-details'
'/8414/capicare"><span itemprop="name">CAPICARE</span></a><a '
'itemprop="url" href="//www.medicineindia.org/medicine-brand-details'
'/230/cyclozobid"><span itemprop="name">CYCLOZOBID</span></a><a '
'itemprop="url" href="//www.medicineindia.org/medicine-brand-details'
'/6855/cinkona"><span itemprop="name">CINKONA</span></a>')
regex = '(?:href=")([^"] )(?:.*?<span.*?>)(.*?)(?:</span>)'
matches = re.findall(regex, html)
for m in matches:
print(f'Brand: {m[1]}, URL: {m[0]}')
Это приведет к следующему:
Brand: CHOLSTIG, URL: //www.medicineindia.org/medicine-brand-details/12220/cholstig
Brand: CAPICARE, URL: //www.medicineindia.org/medicine-brand-details/8414/capicare
Brand: CYCLOZOBID, URL: //www.medicineindia.org/medicine-brand-details/230/cyclozobid
Brand: CINKONA, URL: //www.medicineindia.org/medicine-brand-details/6855/cinkona
Который представляет собой форматированный вывод при переборе списка кортежей, matches
где ссылка сопоставляется с соответствующим содержимым ‘span’.
Комментарии:
1. Предложенное вами решение не работает. На самом деле, мне нужно извлечь эту ссылку из ‘tags’, и я создал ‘tags’ из следующего кода: url= some_url … response = requests.get(url) # Извлечение исходного кода страницы. data = response.text soup = BeautifulSoup(data, ‘lxml’) title_bn = CAPICORE # Извлечение всех тегов <a> в список. теги = soup.find_all(‘a’) Теперь из тегов мне нужно извлечь эту ссылку для CAPICORE
2. Если вместо извлечения всех ссылок вы разберете HTML из
response.text
в строку и запустите findall с флагом многострочности, тогда это сработает.3. Кроме того, если вы используете BeautifulSoup, то почему вы анализируете HTML как «LXML»?