Красивый суп | Как разделить несколько атрибутов внутри тегов <a>

1

Я пытаюсь очистить веб-страницу, чтобы собирать Имена изображений и их соответствующие URL-адреса активов и записывать их в CSV в двух отдельных столбцах. Я не смог отделить attrs от тегов.

В BS4 я могу запустить:

soup.find_all('a')

Он успешно возвращает нижний html (умноженный на количество фотографий на странице)

<a aria-label="SomeImageName" data-asset-id="10101010101" 
href="SomeWebsite">
<img alt="SomeImageName" 
src="https://SomeImageUrl"/>
</a>

Я попытался запустить следующие (и многие другие варианты)

soup.find_all('a', attrs{"aria-label", "src"})

и они возвращаются

[]

Кто-нибудь знает, как извлечь эти данные из тега и записать в CSV?

Ура!

Теги:
web-scraping
beautifulsoup

4 ответа

1
Лучший ответ

Добро пожаловать в StackOverflow! У вас есть ваши требования в двух разных элементах, т. aria-label в a и src в img. Но, к счастью, у вас есть img вложенными внутрь a теге. Так что повторение будет простым.

Храните имена и ссылки в списке словарей и с помощью DictWriter() вы можете легко записать их в файл csv.

import csv
img_data = []
for a_tag in soup.find_all('a'):
    data_dict = dict()
    data_dict['image_name'] = a_tag['aria-label']
    data_dict['url'] = a_tag.img['src']
    img_data.append(data_dict)

with open('urls.csv', 'w') as csvfile:
    fieldnames = ['image_name', 'url']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for data in img_data:    
        writer.writerow(data)

Надеюсь это поможет! Ура!

  • 0
    Спасибо за ответ! Тем не менее, по-прежнему есть проблема - Кажется, это не поднять aria-label . Вот ошибка, которую я получаю в строке 4 KeyError: 'aria-label' Мысли?
  • 0
    Кажется, что некоторые из ваших тегов не имеют атрибута aria-label . вы можете обработать его, либо используя try except либо с помощью следующего кода data_dict['image_name'] = a_tag['aria-label'] if 'aria-label' in str(a_tag) else '' . Последний добавит пустую строку, если атрибут отсутствует, а первый пропустит блоки, которые не имеют атрибута. PS: if else is one liner, и вы можете добавить его просто так.
Показать ещё 4 комментария
0

Спасибо всем за вклад! Я все еще не смог вытащить aria-label и я читал на некоторых других форумах, это проблема BS4 при разборе HTML.

Тем не менее, я смог легко решить это с помощью решения @SmashGuy и вытащить текстовое описание alt по сравнению с aria-label.

img_data = []
for img_tag in soup.find_all('img'):
    data_dict = dict()
    data_dict['image_name'] = img_tag['alt']
    data_dict['image_url'] = img_tag['src']
    img_data.append(data_dict)

А писать в CSV...

with open('BCDS1.csv', 'w', newline='') as birddata:
    fieldnames = ['image_name', 'image_url']
    writer = csv.DictWriter(birddata, fieldnames=fieldnames)
    writer.writeheader()
    for data in img_data:
        writer.writerow(data)

Еще раз спасибо за помощь! Ура!

0

Попробуйте приведенный ниже код, он извлекает значение атрибута src <img> который находится внутри тега <a> который имеет атрибут aria-label и записывает эти ссылки в файл csv

## To get the value of src attribute in the <img> tag
tags = soup.find_all('a')
src=[]
for tag in tags:
    if tag.has_attr('aria-label'):
        src.append(tag.img['src'])

##writing to a csv file
with open('csvfile.csv','w') as file:
    for line in src:
        file.write(line)
        file.write('\n')

Или вы можете использовать модуль csv для записи данных

import csv
with open('csvfile1.csv', "w",newline='') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(src)
  • 1
    find_all и почему бы не использовать модуль csv ?
  • 0
    @G_M, в чем разница между find_all() и findAll() ?
Показать ещё 3 комментария
-1

для изображений вам нужно найти <img>, <a> - разметка ссылок.

<a aria-label="SomeImageName" data-asset-id="10101010101" href="SomeWebsite">
    <img alt="SomeImageName" src="https://SomeImageUrl"/>
</a>

вы нашли это изображение, потому что, как видите, тег ссылки обертывает тег изображения.

и что не так, как работает синтаксис словаря, используйте : в attrs={} (см. https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-keyword-arguments)

так что soup.find_all('a', attrs={'css': 'value'}) вместо soup.find_all('a', attrs{"aria-label" "SomeImageName"})

  • 0
    Пониженный голос как ответ не обеспечил надлежащего решения вопроса. Попробуйте понять вопросы и дать ответы.
  • 0
    я указал, что он нацелился на тег <a>, когда спросил, как захватить атрибут <img>, что означает, что он пропустил бы любые другие изображения, кроме тегов <a>. Не существует правильного подходящего решения, если только целью <a> не было именно его намерение, например, потому что все изображения в HTML-файле, который не был включен , обернуты в тег <a>. Я правильно понял вопрос, чтобы понять, что он недостаточно знает BS4 и HTML.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню