Красивый суп |Как разделить несколько атрибутов внутри тегов <a> - PullRequest
0 голосов
/ 21 сентября 2018

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

В 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?

ура!

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

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

Однако я смог решить эту проблему довольно легко, используя решение @SmashGuy, ивытягивая альтернативное текстовое описание против 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 голосов
/ 21 сентября 2018

для изображений вам нужно найти тег <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 голосов
/ 21 сентября 2018

Добро пожаловать в 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 голосов
/ 21 сентября 2018

Попробуйте приведенный ниже код, он извлекает значение атрибута 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...