Как отфильтровать / удалить элемент, ссылаясь только на класс из findAll - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно исключить это <td class="Ta(c) Py(10px) Pstart(10px)"></td> из данных, которые я получаю из этого кода date_container = container.findAll("td", {"class":"Py(10px) Ta(start) Pend(10px)"})

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import numpy as np
import pandas as pd


my_url = 'https://sg.finance.yahoo.com/quote/D05.SI/history?period1=1555745766&period2=1587368166&interval=1d&filter=history&frequency=1d'


uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")

# grabs info
containers = page_soup.findAll("tr",{"class":"BdT Bdc($seperatorColor) Ta(end) Fz(s) Whs(nw)"})


filename = "book.csv"
f = open(filename, "w")

headers = "date, open, high, low, close\n"

f.write(headers)

for container in containers:
    date_container = container.findAll("td", {"class":"Py(10px) Ta(start) Pend(10px)"})
    date = date_container[0].text

    price_container = container.findAll("td", {"class":"Py(10px) Pstart(10px)"})
    price = price_container.remove("Ta(c) Py(10px) Pstart(10px)")

    open = price[0].text
    high = price[1].text
    low = price[2].text
    close = price[3].text

    print("date: " + date)
    print("open: " + open)
    print("high: " + high)
    print("low: " + low)
    print("close: " + close)

    f.write(date + "," + open + "," + high + "," + low + "," + close + "\n")

f.close()

1 Ответ

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

Другое решение.

from simplified_scrapy import SimplifiedDoc,req,utils
my_url = 'https://sg.finance.yahoo.com/quote/D05.SI/history?period1=1555745766&period2=1587368166&interval=1d&filter=history&frequency=1d'
html = req.get(my_url)
doc = SimplifiedDoc(html)
containers = doc.getElements('tr',value='BdT Bdc($seperatorColor) Ta(end) Fz(s) Whs(nw)')
for container in containers:
  date_container = container.getElement('td',value='Py(10px) Ta(start) Pend(10px)')
  date = date_container.text
  price = container.getElements('td',value='Py(10px) Pstart(10px)').notContains('Ta(c)',attr='class')
  if len(price) < 4: continue
  open = price[0].text
  high = price[1].text
  low = price[2].text
  close = price[3].text
  print("date: " + date)
  print("open: " + open)
  print("high: " + high)
  print("low: " + low)
  print("close: " + close)  

Результат:

date: 20 Apr 2020
open: 19.28
high: 19.35
low: 19.01
close: 19.10
...

Вот еще несколько примеров. https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

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