Добавление Python с добавлением тех же данных - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь извлечь данные о цене акций и рыночной капитализации с корейского сайта.

Вот мой код:

import requests
from bs4 import BeautifulSoup

response = requests.get('http://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page=1')
html = response.text
soup = BeautifulSoup(html, 'html.parser')

table = soup.find('table', { 'class': 'type_2' })
data = []
for tr in table.find_all('tr'):
    tds = list(tr.find_all('td')) 

    for td in tds:
        if td.find('a'):
            company_name = td.find('a').text 
            price_now = tds[2].text
            market_cap = tds[5].text 
            data.append([company_name, price_now, market_cap])    


print(*data, sep = "\n")

И это результат, который я получаю. (Извините за корейские символы)

['삼성 전자', '43, 650 ',' 100 ']

['', '43, 650 ',' 100 ']

['SK 하이닉스', '69, 800 ',' 5000 ']

['', '69, 800 ',' 5000 ']

Вторая и четвертая строка в результатах не должны быть там. Я просто хочу первую и третью строчку. Откуда берутся строки два и четыре и как мне от них избавиться?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

check tds должно быть равно 13 и не нужно многократного for loop

import requests
from bs4 import BeautifulSoup

response = requests.get('http://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page=1')
html = response.text
soup = BeautifulSoup(html, 'html.parser')

table = soup.find('table', { 'class': 'type_2' })
data = []
for tr in table.find_all('tr'):
    tds = tr.find_all('td')
    if len(tds) == 13:
        company_name = tds[1].text 
        price_now = tds[2].text
        market_cap = tds[6].text 
        data.append([company_name, price_now, market_cap])   

print(*data, sep = "\n")

result

['삼성전자', '43,650', '2,802,035']
['SK하이닉스', '69,800', '508,146']
['삼성전자우', '35,850', '323,951']
['셀트리온', '229,000', '287,295']
['LG화학', '345,500', '243,897']
0 голосов
/ 19 ноября 2018

Хотя я не могу это проверить, это может быть из-за того, что на странице есть два тега, которые вы пытаетесь очистить, в то время как ваш цикл for и оператор if настроены на добавление информации всякий раз, когда он находит тег.У первого есть название компании, но у второго нет текста, таким образом, пустой вывод (потому что вы делаете td.find('a').text, он пытается получить текст цели тегом).

Дляссылка, это тег, который вы хотите:

<a href="/item/main.nhn?code=005930" class="tltle">삼성전자</a>

Это то, что вы берете во второй раз:

<a href="/item/board.nhn?code=005930"><img src="https://ssl.pstatic.net/imgstock/images5/ico_debatebl2.gif" width="15" height="13" alt="토론실"></a>

Возможно, вы можете изменить свое выражение if, чтобы сделатьубедитесь, что class тега a title или что-то другое, чтобы убедиться, что вы вводите оператор if только тогда, когда смотрите на тег с названием компании.

I'mна работе, так что я не могу ничего проверить, но дайте мне знать, если у вас есть какие-либо вопросы позже!

0 голосов
/ 19 ноября 2018

Мой дорогой друг, я думаю, проблема в том, что ты должен проверить, есть ли у td.find ('a'). Text значения!

Так что я изменил твой код на это, и оно работает!

import requests
from bs4 import BeautifulSoup

response = requests.get(
    'http://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page=1')
html = response.text
soup = BeautifulSoup(html, 'html.parser')

table = soup.find('table', {'class': 'type_2'})
data = []
for tr in table.find_all('tr'):
    tds = list(tr.find_all('td'))

    for td in tds:
        # where magic happends!
        if td.find('a') and td.find('a').text:
            company_name = td.find('a').text
            price_now = tds[2].text
            market_cap = tds[5].text
            data.append([company_name, price_now, market_cap])

print(*data, sep="\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...