Я пытаюсь очистить веб-страницу, чтобы собирать Имена изображений и их соответствующие 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?
Ура!
Добро пожаловать в 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)
Надеюсь это поможет! Ура!
Спасибо всем за вклад! Я все еще не смог вытащить 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)
Еще раз спасибо за помощь! Ура!
Попробуйте приведенный ниже код, он извлекает значение атрибута 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)
для изображений вам нужно найти <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"})
aria-label
. Вот ошибка, которую я получаю в строке 4KeyError: 'aria-label'
Мысли?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, и вы можете добавить его просто так.