Извлечение данных с помощью веб-скрейпинга

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

`import requests 
from bs4 import BeautifulSoup as bs
import pandas as pd
r = requests.get('https://etfdb.com/etf/ICLN/#fact-sheet', proxies = proxy_support).text
soup = bs(r,'html.parser')
da = soup.find_all('ul', {'class':'list-unstyled'})[0]
n_rows = 0
n_columns = 0
column_names = []

for row in da.find_all('li'):
td_tags = row.find('span')
if len(td_tags) > 0:
   n_rows+=1
   if n_columns == 0:
      n_columns = len(td_tags)

th_tags = row.find_all('a href') 
if len(th_tags) > 0 and len(column_names) == 0:
   for th in th_tags:
    column_names.append(th.get_text())

if len(column_names) > 0 and len(column_names) != n_columns:
            raise Exception("Column titles do not match the number of columns")


 columns = column_names if len(column_names) > 0 else range(0,n_columns)

 df = pd.DataFrame(columns = columns, index= range(0,n_rows))

 row_marker = 0

 for row in da.find_all('li'):
 column_marker = 0
 columns = row.find_all('span')
  for column in columns:
    df.iat[row_marker,column_marker] = columns.get_text()
    column_marker += 1
 if len(columns) > 0:
   row_marker += 1  

Для приведенного выше кода я получаю следующую ошибку:

AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

Может ли кто-нибудь сказать мне, что я делаю неправильно?

какой стол вам нужен? Лично я бы просто использовал .read_html() панд, так как теги <table>

chitown88 22.05.2019 13:02

Я за первым столом. Но когда я смотрю на исходный код, он на самом деле не классифицирует данные по таблице, а как список, я думаю. Класс не имеет стиля списка. Итак, если бы это была таблица, было бы легко получить данные, но в этом случае я не могу этого сделать. Я попробую использовать read.html и посмотрю, что произойдет.

madhav mundra 22.05.2019 14:07

Под первой таблицей вы подразумеваете Vitals?

QHarr 22.05.2019 15:41

Отвечает ли это на ваш вопрос? Beautiful Soup: объект «ResultSet» не имеет атрибута «find_all»?

AMC 22.03.2020 23:33
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

С бс4 4.7.1. получить первый стол

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://etfdb.com/etf/ICLN/#fact-sheet')
soup = bs(r.content, 'lxml')
items = soup.select('h3:contains(Vitals) + ul li')

for item in items:
    print([i.text for i in item.select('span')])

Более ранние версии БС

items = soup.select_one('h3 + ul').select('li')

for item in items:
    print([i.text for i in item.select('span')])

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