BeautifulSoup найти href в шатре

Я использую bs4 для извлечения ссылок из бегущей строки. Я могу получить данные бегущей строки, которые возвращаются как элемент bs4 resultSet. Однако я не могу получить доступ к href внутри данных. Я уверен, что что-то упускаю, так как я новичок в веб-скрейпинге, и ценю любые советы, которые есть у кого-либо.

Примечание. Я могу легко получить ссылки с драйвером селена и хрома, но это занимает вечность.


Это возвращает все данные выделения:

url = 'https://drugs.globalincidentmap.com/'

response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

marquee = soup.select('div', class_='h-48') 
print(marquee)


Однако, когда я пытаюсь углубиться в данные, я получаю пустой список или NoneType/KeyError или AttributeError.

for a in marquee.find_all('a', href=True):
    link = a.find('div', class_=':nth-child')

или

for a in marquee.find_all('a', href=True):
    link = a.find('div', class_='flex p-2')

Ссылки в шатре

что print(marquee) печатает для вас? я ничего не получаю

Driftr95 02.12.2022 23:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу легко получить ссылки с драйвером селена и хрома.

Вероятно, потому что класс div with h-48 загружается с помощью JavaScript; даже если бы это было не так, я не думаю, что soup.find('div', class_='h-48') сработает, потому что у этого элемента больше классов , и вам нужно передать их все как class_ [и я не думаю soap.select('div ', class_='h-48') дает точные результаты, которые вы ожидаете - select на самом деле не должен иметь class_ аргумент - просто CSS-селектор строка].

soup.find('div', attrs = {'class':'h-48'}) or soup.select('div.h-48') can be expected to work on the html that is formed after JS loading, but you need selenium to get that...



К счастью, я думаю, что нужные вам данные уже есть в извлеченном html, просто в другом формате — вы можете извлечь список словарей (mqCont) с помощью

# import json

marq = soup.find('marquee', attrs = {'class':'h-48'})
if marq is None: print('Could Not Find marquee.h-48')
if not marq.get(':contents'): print('marquee.h-48 has no [:contents] attr')

try: mqCont =  json.loads(marq.get(':contents', '[]'))
except Exception as e:
    mqCont = []
    print('failed to parse marquee.h-48[:contents] <---', e)

или, короче (если вы уверены, что не будет ошибок для отладки/разбивки):

mqCont = json.loads(soup.select_one('marquee.h-48').get(':contents', '[]'))

Вы можете получить список ссылок на новостные статьи с помощью [m['url'] for m in mqCont if 'url' in m], но, поскольку вы пытались получить find с помощью class_='flex p-2', вам, вероятно, нужны ссылки .../event_detail?id=.... Вы можете сформировать их, как показано ниже

evtUrls = [f"{url.strip('/')}/event_detail?id = {m['id']}" for m in mqCont if 'id' in m]

Вы также можете просмотреть список словарей в виде таблицы [с пандами], выполнив что-то вроде:

# import pandas

omitKeys = ['domain_event_types', 'country']
for i, m in enumerate(mqCont):
    mDesc = ' '.join(w for w in BeautifulSoup(
        m['description'] if 'description' in m else ''
    ).get_text().split() if w)
    if mDesc: m['description'] = mDesc
    if 'id' in m: m['eventUrl'] = f"{url.strip('/')}/event_detail?id = {m['id']}"
    mqCont[i] = {k:v for k, v in m.items() if k not in omitKeys}

mqcDF = pandas.DataFrame(mqCont).dropna(axis='columns', how='all').set_index('id')

и первые 5 рядов [всего 100 рядов] mqcDF:

я бы идентификатор_страны адрес event_gmt_time строгость инфраструктура наконечник_текст URL описание широта долгота created_user_id location_granularity_id одобрено создан в updated_at URL-адрес события 11919404 231 Пенсильвания, США 2022-12-01 18:36:53 Тяжелый Неизвестный ПЕНСИЛЬВАНИЯ - Фотографии - Подозреваемые - Доказательства в аресте наркотиков в нескольких округах https://www.wfmz.com/news/area/berks/photos-suspects-evidence-in-multi-county-drug-bust/collection_bf795c98-71ad-11ed-99fe-4305f426699b.html#1 [69 НОВОСТИ] ПЕНСИЛЬВАНИЯ - ФОТО: Подозреваемые, улики в деле о наркотиках в нескольких округах «Власти заявили, что они изъяли улики, которые включали 27,5 кг кокаина с потенциальной розничной стоимостью 2,7 миллиона долларов и 5,5 кг фентанила с потенциальной уличной стоимостью 1,6 миллиона долларов. ." Полностью статью читайте по адресу: https://www.wfmz.com/news/area/berks/photos-suspects-evidence-in-multi-county-drug-bust/collection_bf795c98-71ad-11ed-99fe-4305f426699b.html №1 41.2033 -77.1945 14 8 1 2022-12-02T18:44:43.000000Z 2022-12-02T18:44:43.000000Z https://drugs.globalincidentmap.com/event_detail?id=11919404 11919401 40 Остров Ванкувер, Британская Колумбия, Канада 2022-12-01 18:33:01 Тяжелый Неизвестный КАНАДА - Наркотики https://www.terracestandard.com/news/alleged-drug-traffickers-on-vancouver-island-with-hells-angels-ties-face-serious-charges/ [terracestandard.com] КАНАДА – Наркотики и оружие изъяты в 4 г. до н.э. мужчинам, связанным с Hells Angels, грозят «серьезные обвинения». «CFSEU ​​заявил, что изъятые наркотики включали 7,75 кг кокаина, 4 кг каннабиса, 1,9 кг метамфетамина, 248 таблеток оксикодона и многое другое». Полный текст статьи читайте на: https://www.terracestandard.com/news/alleged-drug-traffickers-on-vancouver-island-with-hells-angels-ties-face-serious-charges/ 49.6506 -125,449 14 5 1 2022-12-02T18:36:37.000000Z 2022-12-02T18:36:37.000000Z https://drugs.globalincidentmap.com/event_detail?id=11919401 11919397 133 Мале, Мальдивы 2022-11-20 18:29:26 Тяжелый Неизвестный МАЛЬДИВЫ - Таможня изъяла наркотики на сумму 2 млн евро https://avas.mv/ru/125385 [avas.mv] МАЛЬДИВЫ - Таможня изъяла наркотики на сумму 2 млн. MVR "Таможенная служба Мальдив изъяла 1,34 кг наркотиков, ввезенных контрабандой на Мальдивы через курьера". Полностью статью читайте по ссылке: https://avas.mv/ru/125385 4.1755 73,5093 14 5 1 2022-12-02T18:32:45.000000Z 2022-12-02T18:32:45.000000Z https://drugs.globalincidentmap.com/event_detail?id=11919397 11919394 231 100 South Willow Avenue, Комптон, Калифорния, США 2022-11-29 18:23:50 Тяжелый Неизвестный КАЛИФОРНИЯ - В Комптоне изъяты незаконные наркотики на сумму 4 миллиона долларов США https://www.foxla.com/news/4-million-worth-of-illegal-drugs-seized-in-compton [foxla] КАЛИФОРНИЯ - В Комптоне изъяты незаконные наркотики на сумму 4 миллиона долларов. «В результате обыска в доме было изъято около 5,5 фунтов предполагаемого героина смолы, 10 килограммов предполагаемого кокаинового порошка, 6 килограммов предполагаемого порошкового фентанила, 6000 подозреваемых таблеток экстази, содержащих фентанил, и 254 000 подозреваемых таблеток фентанила общей стоимостью 4,17 миллиона долларов, заявили власти». -незаконных-наркотиков, изъятых-в-Комптоне 33.896 -118,218 14 5 1 2022-12-02T18:29:25.000000Z 2022-12-02T18:29:25.000000Z https://drugs.globalincidentmap.com/event_detail?id=11919394 11919392 166 Гвадар, Пакистан 2022-12-01 18:22:00 Тяжелый Неизвестный ПАКИСТАН - Конвой верблюдов, груженных наркотиками, конфискован https://pakobserver.net/convoy-of-camels-loaded-with-drugs-seized/ [pakobserver.net] ПАКИСТАН - Конвой верблюдов, груженных наркотиками, конфискован "Во время обыска товаров, перевозимых верблюдами, представители ANF обнаружили, что они были полны наркотиков (гашиша). Наркотики весили около 1,4 тонны". Полностью статью читайте по ссылке: https://pakobserver.net/convoy-of-camels-loaded-with-drugs-seized/ 25.1313 62,325 14 5 1 2022-12-02T18:23:49.000000Z 2022-12-02T18:23:49.000000Z https://drugs.globalincidentmap.com/event_detail?id=11919392

Markdown for the above table was printed with print(mqcDf.loc[mqcDf.index[:5]].to_markdown())

Вау, это потрясающе. Большое спасибо за подробное объяснение. Похоже, я просто застрял на доступе к ':contents'. Я очень ценю это.

facepet 03.12.2022 05:10

@facepet рад, что смог помочь! (Это очень необычный атрибут....)

Driftr95 03.12.2022 08:46

Другие вопросы по теме