поиск красивого soup html с переменной

#html #web-scraping #beautifulsoup

#HTML #очистка веб-страниц #beautifulsoup

Вопрос:

Для каждого вида в списке я ищу веб-страницу, которая должна содержать одно и то же текстовое поле с информацией о стиле словаря <dt> english name </dt> <dd> water shrew </dd> , <dt> status </dt> <dd> endangered </dd> и т. Д. Эта информация, которую я хочу, как уже упоминалось, находится в текстовом поле с заголовком перед ним: <h2 class="text-center" id="_02"> COSEWIC assessment aumary</h2> . Вот как это выглядит на самом деле. введите описание изображения здесь

В конечном итоге я пытаюсь извлечь из этого поля строку «находящуюся под угрозой исчезновения», в частности, которую позже я хотел бы ввести в словарь, включая название вида и т. Д. Для каждого вида, который я просматриваю, URL-адрес будет немного отличаться, хотя страницы должны быть структурированы одинаково, но с информацией о разных видах.

Поскольку ответ на «статус» и «английское название» будут разными для каждого вида, я не могу искать сами эти тексты, кроме того, я не могу использовать оператор if-else, потому что это не единственное место на странице, где ключевые слова «находятся под угрозой исчезновения» или «находятся под угрозой исчезновения»появляется. Итак, есть ли способ выбрать только элементы в этом текстовом поле, а затем продолжить поиск? (также не единственное текстовое поле на странице). Или поиск по dt и получение соответствующего dd?

Для справки: https://www.canada.ca/en/environment-climate-change/services/species-risk-public-registry/cosewic-assessments-status-reports/pacific-water-shrew-appraisal-summary-2016.html

Спасибо за ваше время!!!

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

1. Что вы хотите извлечь из веб-сайта?

2. хорошо, я обновил сообщение, чтобы оно содержало эту информацию. В основном я хочу извлечь строку «находящуюся под угрозой исчезновения». Однако да, эта строка будет отличаться для других видов, и поэтому мой метод поиска должен быть более общим, чем для поиска самой строки

Ответ №1:

Предполагая, что я вас правильно понял, это должно сделать это:

 from bs4 import BeautifulSoup as bs
import requests

url = """https://www.canada.ca/en/environment-climate-change/services/species-risk-public-registry/cosewic-assessments-status-reports/pacific-water-shrew-appraisal-summary-2016.html"""
req = requests.get(url)

soup = bs(req.text, 'html.parser')
sumr = soup.select_one('div:has(> h2:-soup-contains-own("COSEWIC assessment aummary")) div[class="mwspanel section"] .dl-horizontal')
targets = sumr.select('dt:has(strong)')
for target in targets:
    print(target.text.strip(),":", target.find_next('dd').text.strip())  
 

Вывод:

 Common name : Pacific Water Shrew
Scientific name : Sorex bendirii
Status : Endangered
Reason for designation : This shrew is restricted to British Columbia’s Lower Mainland and adjacent low valleys. It is rare there, associated with freshwater streams and adjacent wet habitats. Urban development, agriculture, and forestry have reduced the amount and quality of habitat. There is an inferred and projected ongoing decline in habitat and subpopulations in much of its range in Canada.
Occurrence : British Columbia
Status history : Designated Threatened in April 1994 and in May 2000. Status re-examined and designated Endangered in April 2006. Status re-examined and confirmed in April 2016.
 

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

1. вау, это именно то, что мне было нужно! Спасибо! Хотя еще не тестировал его в цикле