Как получить код для чтения всех таблиц при просмотре веб-сайта? - PullRequest
2 голосов
/ 01 мая 2020

Я супер новичок в python, этот сайт очень помог мне в течение семестра, и я надеюсь, что вы, ребята, могли бы помочь мне снова.

Мне нужно очистить таблицы от https://money.cnn.com/data/hotstocks/.

В этих таблицах больше всего активных, выигравших и проигравших.

Теперь я смог заставить этот код работать для меня

     import requests
     from bs4 import BeautifulSoup

     url = 'http://money.cnn.com/data/hotstocks/index.html'
     response = requests.get(url)
     html = response.content

     soup = BeautifulSoup(html)

     all_stock = soup.find('div', attrs={'id':'wsod_hotStocks'})

     table = all_stock.find('table',attrs={'class':'wsod_dataTable wsod_dataTableBigAlt'  })

     for row in table.findAll('tr'):
         for cell in row.findAll('td'):
                 print(cell.text)

, но это дает мне только самую активную таблицу, я не уверен, что мне нужно сделать, чтобы мой код получил другие 2 таблицы, которые есть на сайте.

Буду признателен за понимание того, что я делаю неправильно и как это исправить.

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

[Это HTML с сайта, так что вы, ребята, можете понять, что я делаю. 1

enter image description here

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

На самом деле вы можете использовать pandas.read_html(), который будет читать все таблицы в хорошем формате.

Примечание: он будет возвращать таблицы в виде списка. так что вы можете получить к нему доступ как DataFrame с таким индексом, как, например, print(df[0]).

import pandas as pd

df = pd.read_html("https://money.cnn.com/data/hotstocks/")

print(df)

enter image description here

2 голосов
/ 01 мая 2020

Удалите следующее

table = all_stock.find('table', attrs={'class': 'wsod_dataTable wsod_dataTableBigAlt'})

и просто используйте и обновите

for row in all_stock.find_all('tr'):
    for cell in row.find_all('td'):
        print(cell.text)

Полный код

import requests
from bs4 import BeautifulSoup

url = 'http://money.cnn.com/data/hotstocks/index.html'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html, features='html.parser')

all_stock = soup.find('div', attrs={'id': 'wsod_hotStocks'})

for row in all_stock.find_all('tr'):
    for cell in row.find_all('td'):
        print(cell.text)
1 голос
/ 01 мая 2020

Требуется только для небольшого изменения в существующем коде - используйте find_all вместо find, и l oop через эту новую итерацию.

import requests
from bs4 import BeautifulSoup

url = 'http://money.cnn.com/data/hotstocks/index.html'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html)

all_stock = soup.find('div', attrs={'id':'wsod_hotStocks'})

tables = all_stock.find_all('table',attrs={'class':'wsod_dataTable wsod_dataTableBigAlt'  })

for table in tables:
    print("Next_Table!!")
    for row in table.findAll('tr'):
        for cell in row.findAll('td'):
                print(cell.text)
...