Python pandas.read_html()

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Python pandas.read_html()

Inlägg av Oltronix »

Försöker läsa in följande sida till en python-list: https://www.nordnet.se/mux/web/marknade ... ktier.html med:

Kod: Markera allt

import pandas as pd
df_respD=pd.read_html('https://www.nordnet.se/mux/web/marknaden/kurslista/aktier.html')
print(df_respD)
Men läsningen tar slut vid andra rubrikraden
"Aktie Senast +/- % Köp Sälj Högst Lägst Omsatt Valuta Tid"

Har inte hittat något sätt att läsa hela "matrisen" ej heller att läsa flera block (=data mellan två rubrikrader)

ps
Det jag skrivit tidigare är

Kod: Markera allt

        req = urllib.request.Request(url)
        resp = urllib.request.urlopen(req)
        respData = resp.read()
Och från respData plocka ut den data jag vill bearbeta, men den data jag får då är inte kul att bearbeta även om det går. Den jag kod jag har är inte spec vacker och behöver städas upp. Och bättre då att använda panda och det är någon som gjort jobbet och förmodligen mycket bättre och säkrare kod än den jag kan producera.
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Python pandas.read_html()

Inlägg av hanpa »

Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Python pandas.read_html()

Inlägg av Oltronix »

Prövat "match" parametern tidigare men den verkar inte någon inverkan. Jag kanske använder den på fel sätt
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Python pandas.read_html()

Inlägg av hanpa »

med skiprows?
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Python pandas.read_html()

Inlägg av Oltronix »

japp med skiprows. Dock skummt, möjlig väg?. När jag har match='Fabege AB' så skrivs 1:a blocket ut men om jag stavar fel. text match='FabegeAB' så får jag fel "ValueError: No tables found matching pattern 'FabegeAB' " så hela tabbeln verkar sökas igenom
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Python pandas.read_html()

Inlägg av mounte »

Borta på min hörna python 3.5, pandas 0.19.2, html5lib och beautifulsoup4, så fungerar det.

Kod: Markera allt

import pandas as pd
df = pd.read_html("https://www.nordnet.se/mux/web/marknaden/kurslista/aktier.html")
Notera dock att df är en lista med dataframes, där den första df[0] verkar vara bogus... men df[1] verkar innehålla vettiga värden, se nedan:
df[0]
Out[13]:
0 1 2
0 Vinnare & förlorare Mäklarstatistik Mest omsatta
1 Handelskalender för börsen NaN NaN
2 Kommande bolagstämmor och utdelningar NaN NaN
df[1]
Out[14]:
Unnamed: 0 Aktie Senast +/- % Köp \
0 NaN AAK AB 63450 -200 -0,31% 63450
1 NaN ABB Ltd 21800 20 0,09% 21800
2 NaN Ahlsell AB 6000 -10 -0,17% 6000
3 NaN Ahlstrom-Munksjö Oyj 17600 200 1,15% 17290
4 NaN Alfa Laval AB 18000 -100 -0,55% 18000
5 NaN ASSA ABLOY AB ser. B 19600 280 1,45% 19600
6 NaN AstraZeneca PLC 53400 -550 -1,02% 53400
7 NaN Atlas Copco AB ser. A 33210 -90 -0,27% 33210
8 NaN Atlas Copco AB ser. B 29520 -80 -0,27% 29520
9 NaN Atrium Ljungberg AB ser. B 14690 320 2,23% 14690
10 NaN Attendo AB 9700 475 5,15% 9700
11 NaN Autoliv Inc. SDB 91550 1050 1,16% 91550
12 NaN Avanza Bank Holding AB 35840 240 0,67% 35840
13 NaN Axfood AB 14080 -10 -0,07% 14080
14 NaN Axis AB 34010 -190 -0,56% 34010
15 NaN Betsson AB ser. B 7570 -55 -0,72% 7570
16 NaN BillerudKorsnäs AB 14360 40 0,28% 14360
17 NaN Boliden AB 24280 500 2,10% 24280
18 NaN Bonava AB ser. A 15130 -150 -0,98% 15140
19 NaN Bonava AB ser. B 15150 -220 -1,43% 15150
20 NaN Bravida Holding AB 6445 80 1,26% 6445
21 NaN Castellum AB 12450 120 0,97% 12450
22 NaN Collector AB 9565 40 0,42% 9565
23 NaN Com Hem Holding AB 11620 60 0,52% 11620
24 NaN Dometic Group AB 7090 145 2,09% 7090
25 NaN Electrolux, AB ser. A 29170 -120 -0,41% 29170
26 NaN Electrolux, AB ser. B 27050 -350 -1,28% 27050
27 NaN Elekta AB ser. B 9590 50 0,52% 9590
28 NaN Ericsson, Telefonab. L M ser. A 5750 -50 -0,86% 5750
29 NaN Ericsson, Telefonab. L M ser. B 5845 -30 -0,51% 5845

Sälj Högst Lägst Omsatt Valuta Tid
0 63450 63700 63200 11 610 821 SEK 18:00
1 21800 21800 21610 183 141 993 SEK 18:00
2 6000 6060 5950 9 162 222 SEK 18:00
3 20000 17600 17300 1 179 091 SEK 18:00
4 18000 18100 17860 354 706 178 SEK 18:00
5 19600 19600 19270 371 754 436 SEK 18:00
6 53400 54000 53250 276 875 725 SEK 18:00
7 33210 33360 33030 660 696 252 SEK 18:00
8 29520 29620 29370 230 444 550 SEK 18:00
9 14690 14690 14380 2 185 187 SEK 18:00
10 9700 9945 9400 16 426 337 SEK 18:00
11 91550 91650 90050 455 269 356 SEK 18:00
12 35840 35950 35400 9 880 450 SEK 18:00
13 14080 14200 14030 50 150 666 SEK 18:00
14 34010 34300 34010 251 320 SEK 18:00
15 7570 7645 7570 34 537 421 SEK 18:00
16 14360 14410 14250 72 238 968 SEK 18:00
17 24280 24320 23550 464 529 062 SEK 18:00
18 15160 15360 15070 516 396 SEK 18:00
19 15150 15390 15080 9 227 136 SEK 18:00
20 6445 6445 6365 10 824 212 SEK 18:00
21 12450 12450 12260 57 592 106 SEK 18:00
22 9565 9570 9400 2 450 696 SEK 18:00
23 11620 11720 11480 44 512 981 SEK 18:00
24 7090 7095 6950 159 556 652 SEK 18:00
25 29170 29300 28720 167 473 SEK 18:00
26 27050 27420 26980 333 594 802 SEK 18:00
27 9590 9590 9505 107 836 805 SEK 18:00
28 5750 5840 5680 1 505 676 SEK 18:00
29 5845 5935 5830 480 733 318 SEK 18:00
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Python pandas.read_html()

Inlägg av Oltronix »

Även jag får ut 29 rader men får du även rad 30 och framåt?

Edit:
Python version 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
Pandas version: 0.17.1
Jag får en lista med ett element. Du får något annat med samma kod. Dock är det så att jag kan söka, med "match", på sista blocket i tabellen och får träff men ingen utskrift från det sista blocket.

Kod: Markera allt

df_respD=pd.read_html('https://www.nordnet.se/mux/web/marknaden/kurslista/aktier.html', match='Volvo, AB')
print(df_respD)
>>> type(df_respD)
<class 'list'>
>>> df_respD[0]
Unnamed: 0 Aktie Senast +/- % Köp \
0 NaN AAK AB 63450 -200 -0,31% 63450
1 NaN ABB Ltd 21800 20 0,09% 21800
2 NaN Ahlsell AB 6000 -10 -0,17% 6000
3 NaN Ahlstrom-Munksjö Oyj 17600 200 1,15% 17290
4 NaN Alfa Laval AB 18000 -100 -0,55% 18000
5 NaN ASSA ABLOY AB ser. B 19600 280 1,45% 19600
6 NaN AstraZeneca PLC 53400 -550 -1,02% 53400
7 NaN Atlas Copco AB ser. A 33210 -90 -0,27% 33210
8 NaN Atlas Copco AB ser. B 29520 -80 -0,27% 29520
9 NaN Atrium Ljungberg AB ser. B 14690 320 2,23% 14690
10 NaN Attendo AB 9700 475 5,15% 9700
11 NaN Autoliv Inc. SDB 91550 1050 1,16% 91550
12 NaN Avanza Bank Holding AB 35840 240 0,67% 35840
13 NaN Axfood AB 14080 -10 -0,07% 14080
14 NaN Axis AB 34010 -190 -0,56% 34010
15 NaN Betsson AB ser. B 7570 -55 -0,72% 7570
16 NaN BillerudKorsnäs AB 14360 40 0,28% 14360
17 NaN Boliden AB 24280 500 2,10% 24280
18 NaN Bonava AB ser. A 15130 -150 -0,98% 15140
19 NaN Bonava AB ser. B 15150 -220 -1,43% 15150
20 NaN Bravida Holding AB 6445 80 1,26% 6445
21 NaN Castellum AB 12450 120 0,97% 12450
22 NaN Collector AB 9565 40 0,42% 9565
23 NaN Com Hem Holding AB 11620 60 0,52% 11620
24 NaN Dometic Group AB 7090 145 2,09% 7090
25 NaN Electrolux, AB ser. A 29170 -120 -0,41% 29170
26 NaN Electrolux, AB ser. B 27050 -350 -1,28% 27050
27 NaN Elekta AB ser. B 9590 50 0,52% 9590
28 NaN Ericsson, Telefonab. L M ser. A 5750 -50 -0,86% 5750
29 NaN Ericsson, Telefonab. L M ser. B 5845 -30 -0,51% 5845

Sälj Högst Lägst Omsatt Valuta Tid
0 63450 63700 63200 11 610 821 SEK 18:00
1 21800 21800 21610 183 141 993 SEK 18:00
2 6000 6060 5950 9 162 222 SEK 18:00
3 20000 17600 17300 1 179 091 SEK 18:00
4 18000 18100 17860 354 706 178 SEK 18:00
5 19600 19600 19270 371 754 436 SEK 18:00
6 53400 54000 53250 276 875 725 SEK 18:00
7 33210 33360 33030 660 696 252 SEK 18:00
8 29520 29620 29370 230 444 550 SEK 18:00
9 14690 14690 14380 2 185 187 SEK 18:00
10 9700 9945 9400 16 426 337 SEK 18:00
11 91550 91650 90050 455 269 356 SEK 18:00
12 35840 35950 35400 9 880 450 SEK 18:00
13 14080 14200 14030 50 150 666 SEK 18:00
14 34010 34300 34010 251 320 SEK 18:00
15 7570 7645 7570 34 537 421 SEK 18:00
16 14360 14410 14250 72 238 968 SEK 18:00
17 24280 24320 23550 464 529 062 SEK 18:00
18 15160 15360 15070 516 396 SEK 18:00
19 15150 15390 15080 9 227 136 SEK 18:00
20 6445 6445 6365 10 824 212 SEK 18:00
21 12450 12450 12260 57 592 106 SEK 18:00
22 9565 9570 9400 2 450 696 SEK 18:00
23 11620 11720 11480 44 512 981 SEK 18:00
24 7090 7095 6950 159 556 652 SEK 18:00
25 29170 29300 28720 167 473 SEK 18:00
26 27050 27420 26980 333 594 802 SEK 18:00
27 9590 9590 9505 107 836 805 SEK 18:00
28 5750 5840 5680 1 505 676 SEK 18:00
29 5845 5935 5830 480 733 318 SEK 18:00
>>> df_respD[1]
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
df_respD[1]
IndexError: list index out of range
>>>
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Python pandas.read_html()

Inlägg av mounte »

Du har helt rätt, problemet är att nordnet använder flera tbody under samma table, vilket är helt okej egentligen men pandas stöder inte detta. Det är därför pandas inte läser mer än det som är i första tbody-taggen.
För att komma kring detta så är den långsiktiga lösningen att få nordnet att justera deras kod. Men kortsiktigt och det du själv kan ha kontroll över är att mickla lite med datat innan du kastar pandas på det hela. Se t.ex. följande länk:
http://stackoverflow.com/questions/3631 ... -read-html

För framtida referens om so skulle gå ner eller om någon inte orkar klicka sig vidare så använder man beautifulsoup och tvättar lite:

Kod: Markera allt

import pandas as pd
from bs4 import BeautifulSoup
import pandas as pd

original_html = read_my_page_return_as_string()
soup = BeautifulSoup(original_html, "html.parser")
for body in soup("tbody"):
    body.unwrap()

df = pd.read_html(str(soup), flavor="bs4")
print(df[0])
Hoppas du kan komma vidare nu...
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Python pandas.read_html()

Inlägg av Oltronix »

Tack :D Det fungerar nu. Det blev en list med 2 element df[0] och df[1]. Där df[1] inehöll den väsäntliga infon. Nu får jag läsa om BeatifullSoup så jag fattar vad det är.

Edit:
Tom ÅÄÖ fixade sig på en gång. Det var ett problem när jag parsade html-filen själv, att hitta rätt i "\\\\xc3\\\\xa4" världen. Jag fattade inte riktigt hur python hanterade \. Jag tycke att det var för många, 4 st.
Skriv svar