Отказ от Yahoo финансов в течение 1000 * с BeautifulSoup - PullRequest
1 голос
/ 11 апреля 2020

Я учусь чистить сайты с помощью Beautifulsoup и пытался получить данные из финансов Yahoo. Когда я продвигаюсь, я застреваю в удивлении, если есть причина, по которой он успешно выбирает то, что я хочу, когда я не в состоянии для l oop (поиск определенного тикера c), но как только я пытаюсь чтобы заставить его использовать файл csv для поиска более одного тикера, метод .find () возвращает ошибку вместо искомого тега.

Вот код, когда он работает хорошо ,

    ```
    import requests
    import csv
    from bs4 import BeautifulSoup

    > ------ FOR LOOP THAT MESSES THINGS UP ----- <
    # with open('s&p500_tickers.csv', 'r') as tickers:
    #     for ticker in tickers:


    ticker = 'AAPL' > ------ TEMPORARY TICKER TO TEST CODE

    web = requests.get(f'https://ca.finance.yahoo.com/quote/{ticker}/financials?p={ticker}').text
    soup = BeautifulSoup(web, 'lxml')
    section = soup.find('section', class_='smartphone_Px(20px) Mb(30px)')
    tbl = section.find('div', class_='M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)')
    headerRow = tbl.find("div", class_="D(tbr) C($primaryColor)")

    > ------ CODE I USED TO VISUALIZE THE RESULT ------ <
    breakdownHead = headerRow.text[0:9]
    ttmHead = headerRow.text[9:12]
    lastYear = headerRow.text[12:22]
    twoYears = headerRow.text[22:32]
    threeYears = headerRow.text[32:42]
    fourYears = headerRow.text[42:52]

    print(breakdownHead, ttmHead, lastYear, twoYears, threeYears, fourYears)

    ```

Возвращает это:

    ```
    Breakdown ttm 2019-09-30 2018-09-30 2017-09-30 2016-09-30

    Process finished with exit code 0
    ```

Вот код, который не работает

    ```
    import requests
    import csv
    from bs4 import BeautifulSoup

    with open('s&p500_tickers.csv', 'r') as tickers:
        for ticker in tickers:

            web = requests.get(f'https://ca.finance.yahoo.com/quote/{ticker}/financials?p={ticker}').text
            soup = BeautifulSoup(web, 'lxml')
            section = soup.find('section', class_='smartphone_Px(20px) Mb(30px)')
            tbl = section.find('div', class_='M(0) Whs(n) BdEnd Bdc($seperatorColor) D(itb)')
            headerRow = tbl.find("div", class_="D(tbr) C($primaryColor)")

            breakdownHead = headerRow.text[0:9]
            ttmHead = headerRow.text[9:12]
            lastYear = headerRow.text[12:22]
            twoYears = headerRow.text[22:32]
            threeYears = headerRow.text[32:42]
            fourYears = headerRow.text[42:52]

            print(breakdownHead, ttmHead, lastYear, twoYears, threeYears, fourYears)
    ```

I Приветствую любые отзывы о моем коде, так как я всегда стараюсь поправиться.

Большое спасибо

1 Ответ

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

Итак, я решил проблему.

Я понял, что метод .writerow() модуля csv добавляет '\n' в конце строки. (Пример: 'MMM\n').

Каким-то образом в новой строке был сохранен метод .find(), который должен быть выполнен в течение l oop. (До сих пор не знаю, почему)

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

Я заменил '\n' на '', и это сработало. Вот как это выглядит:

    '''
    for ticker in tickers.readlines():
        ticker = ticker.replace('\n', '')
        if ticker == '':
            pass
        else:
            web = requests.get(f'https://ca.finance.yahoo.com/quote/{ticker}/financials?p={ticker}').text
            soup = BeautifulSoup(web, 'lxml')
            headerRow = soup.find("div", class_="D(tbr) C($primaryColor)")
    '''

Если кто-нибудь из вас найдет лучший способ сделать это, я был бы рад получить ваши отзывы. Я новичок в программировании и очень хотел бы знать, что я делаю неправильно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...