Найти подкласс класса и вернуть список элементов

avatar
Hasophie
8 августа 2021 в 18:17
27
1
0

Я намерен очистить некоторые страны с веб-страницы, которые находятся в главе 4, и вернуть список этих стран. Проблема в том, что я не могу получить тег

ИСПОЛЬЗОВАНИЕ ЧТЕНИЯ HTML

reqUS = Request('https://www.state.gov/reports/country-reports-on-terrorism-2019/', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'})
US = urlopen(reqUS).read()

# print(US)

# Create  a soup object
soup = BeautifulSoup(US, 'html.parser')


# find class "floated-right well"
#Terrorist_list = soup.find_all(attrs={"class": "report__section-title"})

Chapter4 = (soup.find('h2', class_="report__section-title",id="report-toc__section-7"))
#print(Chapter4)

# Give location where text is stored which you wish to alter
unordered_list = soup.find("h2", {"id": "report-toc__section-7"})
print(unordered_list)
Источник
Andrej Kesely
8 августа 2021 в 18:41
0

Какие страны вы хотите получить с этой страницы?

Ответы (1)

avatar
QHarr
8 августа 2021 в 21:29
0

Вы можете использовать #report-toc__section-7 в качестве точки привязки, TERRORIST SAFE HAVENS в качестве начальной точки и COUNTERING TERRORISM ON THE ECONOMIC FRONT в качестве конечной точки. Используйте их в качестве текста, чтобы перейти в :-soup-contains для фильтрации с помощью селекторов CSS, чтобы получить только теги p между тегами с дочерним тегом strong (используя :has). Вам также необходимо добавить :not, чтобы удалить p с дочерними элементами strong после и включая конечную точку. Из этой фильтрации вытащите дочерние теги strong, в которых есть местонахождение и страны.

Зациклить возвращаемый список и проверить, является ли текст strong заглавными; если да, то это местность и может быть ключом словаря, к которому вы добавляете список следующих значений strong в качестве стран; повторяя по мере того, как вы сталкиваетесь с каждой новой местностью. Затем вы можете выбрать конкретные страны по местонахождению.

Для более старых версий bs4 замените :-soup-contains на :contains.

import requests
from bs4 import BeautifulSoup as bs

r = requests.get(
    'https://www.state.gov/reports/country-reports-on-terrorism-2019/')
soup = bs(r.content, 'lxml')

items = soup.select('section:has(>#report-toc__section-7) p:has(strong:-soup-contains("TERRORIST SAFE HAVENS")) ~ p:has(strong):not(p:has(strong:-soup-contains("COUNTERING TERRORISM ON THE ECONOMIC FRONT")), p:has(strong:-soup-contains("COUNTERING TERRORISM ON THE ECONOMIC FRONT")) ~ p) > strong')

d = {}

for i in items:
    if i.text.isupper():
        key = i.text
        d[key] = []
    else:
        value = i.text.strip()
        if value:
            d[key].append(value)
print(d)

Отпечатки

enter image description here

Подробнее о селекторах css читайте здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes

Hasophie
12 августа 2021 в 16:51
0

Действительно полезно. Единственная проблема заключается в том, что я получаю следующую ошибку, используя :contains «Псевдоэлемент найден в позиции 49»

Hasophie
12 августа 2021 в 16:56
0

Новый код: ''' items = soap.select('section:has(>#report-toc__section-7) p:has(strong::contains("ТЕРРОРИСТИЧЕСКАЯ БЕЗОПАСНОСТЬ")) ~ p:has(strong):not (p:has(strong:-soup-contains("ПРОТИВОДЕЙСТВИЕ ТЕРРОРИЗМУ НА ЭКОНОМИЧЕСКОМ ФРОНТЕ")), p:has(strong:-soup-contains("ПРОТИВОДЕЙСТВИЕ ТЕРРОРИЗМУ НА ЭКОНОМИЧЕСКОМ ФРОНТЕ")) ~ p) > strong' )'''