Невозможно очистить правильный wikitable с BeautifulSoup4 (новичок) - PullRequest
1 голос
/ 12 апреля 2020

Полный новичок здесь ... Я пытаюсь вычистить таблицу составляющих из этой страницы Википедии , однако очищенная таблица была годовой доходностью (1-я таблица) вместо таблицы составляющих (2-я таблица) что мне нужно Может ли кто-нибудь помочь увидеть, есть ли способ указать целевую таблицу c, которую я хочу использовать BeautifulSoup4?

import bs4 as bs
import pickle
import requests

def save_klci_tickers():
    resp = requests.get ('https://en.wikipedia.org/wiki/FTSE_Bursa_Malaysia_KLCI')
    soup = bs.BeautifulSoup(resp.text)
    table = soup.find ('table', {'class': 'wikitable sortable'})
    tickers = []
    for row in table.findAll ('tr') [1:]:
        ticker = row.findAll ('td') [0].text
        tickers.append(ticker)

    with open ("klcitickers.pickle", "wb") as f:
        pickle.dump (tickers, f)

    print (tickers)
    return tickers


save_klci_tickers()

1 Ответ

1 голос
/ 12 апреля 2020

Попробуйте pandas библиотеку, чтобы получить табличные данные с этой страницы в CSV-файле с мгновенным взором:

import pandas as pd

url = 'https://en.wikipedia.org/wiki/FTSE_Bursa_Malaysia_KLCI'

df = pd.read_html(url, attrs={"class": "wikitable"})[1] #change the index to get the table you need from that page
new = pd.DataFrame(df, columns=["Constituent Name", "Stock Code", "Sector"])
new.to_csv("wiki_data.csv", index=False)
print(df)

Если это все еще BeautifulSoup, который вы хотите придерживаться, следующее должно служить цель:

import requests
from bs4 import BeautifulSoup

res = requests.get("https://en.wikipedia.org/wiki/FTSE_Bursa_Malaysia_KLCI")
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("table.wikitable")[1].select("tr"):
    data = [item.get_text(strip=True) for item in items.select("th,td")]
    print(data)

Если вы хотите использовать .find_all() вместо .select(), попробуйте следующее:

for items in soup.find_all("table",class_="wikitable")[1].find_all("tr"):
    data = [item.get_text(strip=True) for item in items.find_all(["th","td"])]
    print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...