Im trying to extract all Product Names, Product Codes, Prices, and Specs from a website, but there's no classes I can use to dig deeper into the html tree, so I have to use data-type and data-id, and all the tr and td info inside of it. However, if I now search for data-id, it only shows me the names, but not actually the content inside of it.
Right now the code is a little chaotic, Ive been trying as many solutions as I can, but none of them worked so far
Heres my code:
from cgitb import text
from pickle import TRUE
from bs4 import BeautifulSoup
import requests
import urllib
import pandas as pd
import json
url = "https://www.albelli.nl/prijsoverzicht"
result = requests.get(url)
doc = BeautifulSoup(result.text, "html.parser")
WholeDoc = doc.find('div', 'arc3-container arc3-margin--bottom-none arc3-margin--top-none price-overview--content')
for letstry in WholeDoc.find_all('div', attrs={'data-type' : 'Photobook'}):
for item in letstry.find_all('tbody'):
for moop in item.find_all('tr', attrs=('data-id')):
print(moop)
I tried using the attrs=() function, but it doesnt get me the content INSIDE of the data-id, however, it seems to work with the data-type
.find_all('tr', attrs=('data-id'))
CodePudding user response:
.find_all('tr', attrs=('data-id'))
is not the correct way to use find
; if you want rows that have a data-id
attribute, you can use select
with
You can print all the tables under any data-type
with
for t in doc.select('div[data-type]'):
titleLine = t.get('data-type').upper()
if t.get('data-subtype'):
titleLine = ' --> ' t.get('data-subtype').upper()
print(titleLine)
divider = ('| ' ' | '.join([
' '*40 if i == 1 else (' '*20 if i == 0 else ' '*15)
for i in range(len(t.select('th')) 1)
]) ' |')
print(divider)
print('|', ' | '.join([
f'{c[:40]:^40}' if i == 1 else
(f'{c[:20]:^20}' if i == 0 else f'{c[:15]:^15}')
for i, c in enumerate(
['Data-ID'] [col.text.strip() for col in t.select('th')]
)]), '|')
print(divider)
for r in t.select('tr:has(td)'):
print('|', ' | '.join([
f'{c:^40}' if i == 1 else (f'{c:^20}' if i == 0 else f'{c:^15}')
for i, c in enumerate(
[r.get('data-id', '')]
[col.text.strip() for col in r.select('td')]
)]), '|')
print(divider, '\n')
Output:
PHOTOBOOK --> LANDSCAPE
| | | | | | | | | |
| Data-ID | Fotoboek Liggend | Prijs | Per extra pagin | Linnen kaft met | Foto op kaft | Leren kaft | Platliggend pre | Hoogglans meerp |
| | | | | | | | | |
| PAP_354 | Liggend S (Harde kaft 13 x 10 cm) | € 10,99 | € 0,39 | - | € 2,50 | € 3,95 | - | € 0,03 |
| PAP_109 | Liggend M (Zachte kaft 20 x 15 cm) | € 16,49 | € 0,55 | - | - | - | - | € 0,03 |
| PAP_130 | Liggend M (Harde kaft 20 x 15 cm) | € 18,99 | € 0,51 | - | € 1,00 | € 5,00 | - | € 0,03 |
| PAP_350 | Liggend L (Zachte kaft 28 x 21 cm) | € 21,99 | € 0,71 | - | - | - | - | € 0,04 |
| PAP_347 | Liggend L (Harde kaft 28 x 21 cm) | € 26,99 | € 0,67 | - | € 5,50 | € 9,45 | € 0,39 | € 0,21 |
| PAP_355 | Liggend XL (Harde kaft 39 x 29 cm) | € 48,49 | € 1,31 | - | € 12,00 | € 10,00 | € 0,63 | € 0,21 |
| | | | | | | | | |
PHOTOBOOK --> SQUARE
| | | | | | | | | |
| Data-ID | Fotoboeken Vierkant | Prijs | Per extra pagin | Linnen kaft met | Foto op kaft | Leren kaft | Platliggend pre | Hoogglans meerp |
| | | | | | | | | |
| PAP_203 | Vierkant S (Zachte kaft 10 x 10 cm) | € 6,99 | € 0,43 | - | - | - | - | € 0,03 |
| PAP_205 | Vierkant M (Zachte kaft 14 x 14 cm) | € 12,49 | € 0,47 | - | - | - | - | € 0,03 |
| PAP_360 | Vierkant M (Harde kaft 14 x 14 cm) | € 15,99 | € 0,57 | - | € 1,50 | € 5,00 | - | € 0,03 |
| PAP_204 | Vierkant L (Zachte kaft 21 x 21 cm) | € 20,49 | € 0,71 | - | - | - | - | € 0,03 |
| PAP_324 | Vierkant L (Harde kaft 21 x 21 cm) | € 25,49 | € 0,63 | - | € 5,00 | € 7,95 | € 0,39 | € 0,03 |
| PAP_194 | Vierkant XL (Harde kaft 30 x 30 cm) | € 45,99 | € 0,95 | - | € 2,50 | € 10,00 | € 0,45 | € 0,21 |
| | | | | | | | | |
PHOTOBOOK --> PORTRAIT
| | | | | | | | | |
| Data-ID | Fotoboek Staand | Prijs | Per extra pagin | Linnen kaft met | Foto op kaft | Leren kaft | Platliggend pre | Hoogglans meerp |
| | | | | | | | | |
| PAP_201 | Staand M (Harde kaft 15 x 20 cm) | € 18,99 | € 0,51 | - | € 1,00 | € 5,00 | - | € 0,03 |
| PAP_349 | Staand L (Zachte kaft 21 x 28 cm) | € 21,99 | € 0,71 | - | - | - | - | € 0,04 |
| PAP_348 | Staand L (Harde kaft 21 x 28 cm) | € 26,99 | € 0,67 | - | € 5,50 | € 9,45 | € 0,39 | € 0,21 |
| PAP_202 | Staand XL (Harde kaft 27 x 36 cm) | € 48,49 | € 1,31 | - | € 12,00 | € 10,00 | - | € 0,21 |
| | | | | | | | | |
WALLART --> ALUMINIUM
| | | | |
| Data-ID | Foto op aluminium | Prijs | Oriëntatie |
| | | | |
| PAP_510 | Foto op aluminium ( 30 x 20 cm) | € 26,99 | Liggend |
| PAP_511 | Foto op aluminium ( 40 x 30 cm) | € 43,49 | Liggend |
| PAP_512 | Foto op aluminium ( 60 x 40 cm) | € 57,99 | Liggend |
| PAP_513 | Foto op aluminium ( 70 x 50 cm) | € 91,99 | Liggend |
| PAP_514 | Foto op aluminium ( 80 x 60 cm) | € 144,99 | Liggend |
| PAP_515 | Foto op aluminium ( 100 x 70 cm) | € 159,99 | Liggend |
| PAP_516 | Foto op aluminium ( 120 x 80 cm) | € 219,99 | Liggend |
| PAP_517 | Foto op aluminium ( 20 x 30 cm) | € 26,99 | Staand |
| PAP_518 | Foto op aluminium ( 30 x 40 cm) | € 43,49 | Staand |
| PAP_519 | Foto op aluminium ( 40 x 60 cm) | € 57,99 | Staand |
| PAP_520 | Foto op aluminium ( 50 x 70 cm) | € 91,99 | Staand |
| PAP_521 | Foto op aluminium ( 60 x 80 cm) | € 144,99 | Staand |
| PAP_522 | Foto op aluminium ( 70 x 100 cm) | € 159,99 | Staand |
| PAP_523 | Foto op aluminium ( 80 x 120 cm) | € 219,99 | Staand |
| PAP_531 | Foto op aluminium ( 20 x 20 cm) | € 23,99 | Vierkant |
| PAP_524 | Foto op aluminium ( 30 x 30 cm) | € 39,49 | Vierkant |
| PAP_525 | Foto op aluminium ( 40 x 40 cm) | € 47,49 | Vierkant |
| PAP_526 | Foto op aluminium ( 50 x 50 cm) | € 79,99 | Vierkant |
| PAP_527 | Foto op aluminium ( 60 x 60 cm) | € 94,99 | Vierkant |
| PAP_528 | Foto op aluminium ( 70 x 70 cm) | € 114,99 | Vierkant |
| PAP_529 | Foto op aluminium ( 80 x 80 cm) | € 159,99 | Vierkant |
| PAP_530 | Foto op aluminium ( 100 x 100 cm) | € 209,99 | Vierkant |
| | | | |
WALLART --> CANVAS
| | | | | |
| Data-ID | Foto op canvas | Prijs | Zwevende lijst | Oriëntatie |
| | | | | |
| PAP_418 | Foto op canvas ( 30 x 20 cm) | € 20,49 | € 15,99 | Liggend |
| PAP_403 | Foto op canvas ( 40 x 30 cm) | € 25,49 | € 20,49 | Liggend |
| PAP_404 | Foto op canvas ( 60 x 40 cm) | € 38,49 | € 24,49 | Liggend |
| PAP_405 | Foto op canvas ( 70 x 50 cm) | € 40,49 | € 27,99 | Liggend |
| PAP_427 | Foto op canvas ( 80 x 60 cm) | € 57,49 | € 30,49 | Liggend |
| PAP_408 | Foto op canvas ( 100 x 70 cm) | € 74,99 | € 37,99 | Liggend |
| PAP_409 | Foto op canvas ( 120 x 80 cm) | € 119,99 | € 39,99 | Liggend |
| PAP_420 | Foto op canvas ( 20 x 30 cm) | € 20,49 | € 15,49 | Staand |
| PAP_421 | Foto op canvas ( 30 x 40 cm) | € 25,49 | € 20,99 | Staand |
| PAP_422 | Foto op canvas ( 40 x 60 cm) | € 38,49 | € 23,99 | Staand |
| PAP_423 | Foto op canvas ( 50 x 70 cm) | € 40,49 | € 26,99 | Staand |
| PAP_426 | Foto op canvas ( 60 x 80 cm) | € 57,49 | € 29,99 | Staand |
| PAP_424 | Foto op canvas ( 70 x 100 cm) | € 74,99 | € 36,99 | Staand |
| PAP_425 | Foto op canvas ( 80 x 120 cm) | € 119,99 | € 41,99 | Staand |
| PAP_428 | Foto op canvas ( 20 x 20 cm) | € 6,49 | € 14,99 | Vierkant |
| PAP_410 | Foto op canvas ( 30 x 30 cm) | € 21,99 | € 17,49 | Vierkant |
| PAP_411 | Foto op canvas ( 40 x 40 cm) | € 31,99 | € 22,99 | Vierkant |
| PAP_412 | Foto op canvas ( 50 x 50 cm) | € 38,49 | € 24,99 | Vierkant |
| PAP_413 | Foto op canvas ( 60 x 60 cm) | € 50,99 | € 26,99 | Vierkant |
| PAP_414 | Foto op canvas ( 70 x 70 cm) | € 57,49 | € 29,99 | Vierkant |
| PAP_415 | Foto op canvas ( 80 x 80 cm) | € 60,49 | € 35,99 | Vierkant |
| PAP_417 | Foto op canvas ( 100 x 100 cm) | € 92,99 | € 39,99 | Vierkant |
| | | | | |
WALLART --> FOREX
| | | | |
| Data-ID | Foto op forex | Prijs | Oriëntatie |
| | | | |
| PAP_540 | Foto op forex ( 30 x 20 cm) | € 23,99 | Liggend |
| PAP_541 | Foto op forex ( 40 x 30 cm) | € 33,49 | Liggend |
| PAP_542 | Foto op forex ( 60 x 40 cm) | € 39,99 | Liggend |
| PAP_543 | Foto op forex ( 70 x 50 cm) | € 70,99 | Liggend |
| PAP_544 | Foto op forex ( 80 x 60 cm) | € 99,99 | Liggend |
| PAP_545 | Foto op forex ( 100 x 70 cm) | € 109,99 | Liggend |
| PAP_546 | Foto op forex ( 120 x 80 cm) | € 159,99 | Liggend |
| PAP_547 | Foto op forex ( 20 x 30 cm) | € 23,99 | Staand |
| PAP_548 | Foto op forex ( 30 x 40 cm) | € 33,49 | Staand |
| PAP_549 | Foto op forex ( 40 x 60 cm) | € 39,99 | Staand |
| PAP_562 | Foto op forex ( 50 x 70 cm) | € 70,99 | Staand |
| PAP_563 | Foto op forex ( 60 x 80 cm) | € 99,99 | Staand |
| PAP_552 | Foto op forex ( 70 x 100 cm) | € 109,99 | Staand |
| PAP_553 | Foto op forex ( 80 x 120 cm) | € 159,99 | Staand |
| PAP_561 | Foto op forex ( 20 x 20 cm) | € 16,99 | Vierkant |
| PAP_554 | Foto op forex ( 30 x 30 cm) | € 26,99 | Vierkant |
| PAP_555 | Foto op forex ( 40 x 40 cm) | € 34,99 | Vierkant |
| PAP_556 | Foto op forex ( 50 x 50 cm) | € 51,99 | Vierkant |
| PAP_557 | Foto op forex ( 60 x 60 cm) | € 55,49 | Vierkant |
| PAP_558 | Foto op forex ( 70 x 70 cm) | € 92,99 | Vierkant |
| PAP_559 | Foto op forex ( 80 x 80 cm) | € 114,99 | Vierkant |
| PAP_560 | Foto op forex ( 100 x 100 cm) | € 149,99 | Vierkant |
| | | | |
WALLART --> PLEXIGLAS
| | | | |
| Data-ID | Foto op plexiglas | Prijs | Oriëntatie |
| | | | |
| PAP_454 | Foto op plexiglas ( 30 x 20 cm) | € 35,49 | Liggend |
| PAP_450 | Foto op plexiglas ( 40 x 30 cm) | € 46,99 | Liggend |
| PAP_451 | Foto op plexiglas ( 60 x 40 cm) | € 91,99 | Liggend |
| PAP_452 | Foto op plexiglas ( 70 x 50 cm) | € 114,99 | Liggend |
| PAP_456 | Foto op plexiglas ( 80 x 60 cm) | € 169,99 | Liggend |
| PAP_453 | Foto op plexiglas ( 100 x 70 cm) | € 229,99 | Liggend |
| PAP_455 | Foto op plexiglas ( 120 x 80 cm) | € 289,99 | Liggend |
| PAP_470 | Foto op plexiglas ( 20 x 30 cm) | € 35,49 | Staand |
| PAP_471 | Foto op plexiglas ( 30 x 40 cm) | € 46,99 | Staand |
| PAP_472 | Foto op plexiglas ( 40 x 60 cm) | € 91,99 | Staand |
| PAP_473 | Foto op plexiglas ( 50 x 70 cm) | € 114,99 | Staand |
| PAP_476 | Foto op plexiglas ( 60 x 80 cm) | € 169,99 | Staand |
| PAP_474 | Foto op plexiglas ( 70 x 100 cm) | € 229,99 | Staand |
| PAP_475 | Foto op plexiglas ( 80 x 120 cm) | € 289,99 | Staand |
| PAP_487 | Foto op plexiglas ( 20 x 20 cm) | € 32,49 | Vierkant |
| PAP_480 | Foto op plexiglas ( 30 x 30 cm) | € 35,49 | Vierkant |
| PAP_481 | Foto op plexiglas ( 40 x 40 cm) | € 59,99 | Vierkant |
| PAP_482 | Foto op plexiglas ( 50 x 50 cm) | € 99,99 | Vierkant |
| PAP_483 | Foto op plexiglas ( 60 x 60 cm) | € 149,99 | Vierkant |
| PAP_484 | Foto op plexiglas ( 70 x 70 cm) | € 179,99 | Vierkant |
| PAP_485 | Foto op plexiglas ( 80 x 80 cm) | € 219,99 | Vierkant |
| PAP_486 | Foto op plexiglas ( 100 x 100 cm) | € 239,99 | Vierkant |
| | | | |
WALLART --> POSTER
| | | | | | | |
| Data-ID | Posters | Prijs | Oriëntatie | Mat papier* | Glanzend* | Extra mat* |
| | | | | | | |
| PAP_610 | Poster ( 30 x 20 cm) | € 4,99 | Liggend | - | € 0,49 | € 0,49 |
| PAP_611 | Poster ( 40 x 30 cm) | € 7,49 | Liggend | - | € 0,99 | € 0,99 |
| PAP_612 | Poster ( 60 x 40 cm) | € 11,99 | Liggend | - | € 1,49 | € 1,49 |
| PAP_613 | Poster ( 70 x 50 cm) | € 14,49 | Liggend | - | € 1,99 | € 1,99 |
| PAP_614 | Poster ( 80 x 60 cm) | € 19,99 | Liggend | - | € 2,49 | € 2,49 |
| PAP_615 | Poster ( 100 x 70 cm) | € 23,49 | Liggend | - | € 3,49 | € 3,49 |
| PAP_616 | Poster ( 120 x 80 cm) | € 28,99 | Liggend | - | € 3,99 | € 3,99 |
| PAP_617 | Poster ( 20 x 30 cm) | € 4,99 | Staand | - | € 0,49 | € 0,49 |
| PAP_618 | Poster ( 30 x 40 cm) | € 7,49 | Staand | - | € 0,99 | € 0,99 |
| PAP_619 | Poster ( 40 x 60 cm) | € 11,99 | Staand | - | € 1,49 | € 1,49 |
| PAP_620 | Poster ( 50 x 70 cm) | € 14,49 | Staand | - | € 1,99 | € 1,99 |
| PAP_621 | Poster ( 60 x 80 cm) | € 19,99 | Staand | - | € 2,49 | € 2,49 |
| PAP_622 | Poster ( 70 x 100 cm) | € 23,49 | Staand | - | € 3,49 | € 3,49 |
| PAP_623 | Poster ( 80 x 120 cm) | € 28,99 | Staand | - | € 3,99 | € 3,99 |
| PAP_624 | Poster ( 20 x 20 cm) | € 3,11 | Vierkant | - | € 0,49 | € 0,49 |
| PAP_625 | Poster ( 30 x 30 cm) | € 6,99 | Vierkant | - | € 0,99 | € 0,99 |
| PAP_626 | Poster ( 40 x 40 cm) | € 8,99 | Vierkant | - | € 0,99 | € 0,99 |
| PAP_627 | Poster ( 50 x 50 cm) | € 12,49 | Vierkant | - | € 1,49 | € 1,49 |
| PAP_628 | Poster ( 60 x 60 cm) | € 15,99 | Vierkant | - | € 1,99 | € 1,99 |
| PAP_629 | Poster ( 70 x 70 cm) | € 16,99 | Vierkant | - | € 2,99 | € 2,99 |
| PAP_630 | Poster ( 80 x 80 cm) | € 22,99 | Vierkant | - | € 3,49 | € 3,49 |
| PAP_631 | Poster ( 100 x 100 cm) | € 36,49 | Vierkant | - | € 4,49 | € 4,49 |
| | | | | | | |
CALENDAR --> CALENDAR
| | | | | | |
| Data-ID | Fotokalenders | Prijs | Mat papier | Glanzend | Extra mat |
| | | | | | |
| PAP_653 | Fotokalender A4 Dubbel | € 22,49 | Standaard | € 25,09 | € 24,44 |
| PAP_658 | Vierkant | € 9,49 | Standaard | € 11,44 | € 10,79 |
| PAP_659 | Fotokalender A4 | € 16,49 | Standaard | € 19,09 | € 18,44 |
| PAP_660 | Fotokalender A3 | € 26,49 | Standaard | € 29,74 | € 29,09 |
| | | | | | |
PRINTS --> PRINTS
| | | | | | | |
| Data-ID | Foto’s afdrukken | Prijs | Exacte afmeting | Glanzend* | Witte rand* | Mat papier* |
| | | | | | | |
| PAP_910_102x102 cm | Premium afdrukken 10 cm | € 0,12 | 10.2x10.2 cm | - | € 0,02 | € 0,02 |
| PAP_910_102x136 cm | Premium afdrukken 10 cm | € 0,18 | 10.2x13.6 cm | - | € 0,02 | € 0,02 |
| PAP_910_102x153 cm | Premium afdrukken 10 cm | € 0,20 | 10.2x15.3 cm | - | € 0,02 | € 0,02 |
| PAP_911_127x127 cm | Premium afdrukken 13 cm | € 0,20 | 12.7x12.7 cm | - | € 0,02 | € 0,02 |
| PAP_911_127x169 cm | Premium afdrukken 13 cm | € 0,21 | 12.7x16.9 cm | - | € 0,02 | € 0,02 |
| PAP_911_127x180 cm | Premium afdrukken 13 cm | € 0,24 | 12.7x18.0 cm | - | € 0,02 | € 0,02 |
| PAP_910_102x120 cm | Retro foto's | € 0,42 | 10.2x12.0 cm | - | € 0,02 | € 0,02 |
| PAP_911_127x190 cm | Foto vergroten | € 0,30 | 12.7x19.0 cm | - | € 0,02 | € 0,02 |
| | | | | | | |
CARD --> UNFOLDED
| | | | | | |
| Data-ID | Enkele fotokaarten | Prijs* | Mat papier* | Glanzend* | Extra mat* |
| | | | | | |
| PAP_940 | 10 x 10 cm | € 5,49 | - | € 0,25 | € 0,15 |
| PAP_941 | 15 x 15 cm | € 11,49 | - | € 1,00 | € 0,80 |
| PAP_942 | 10 x 15 cm | € 7,99 | - | € 0,90 | € 0,75 |
| PAP_943 | 15 x 10 cm | € 7,99 | - | € 0,90 | € 0,75 |
| PAP_944 | 13 x 19 cm | € 12,99 | - | € 1,25 | € 1,00 |
| PAP_945 | 19 x 13 cm | € 12,99 | - | € 1,25 | € 1,00 |
| | | | | | |
CARD --> FOLDED
| | | | | | |
| Data-ID | Dubbele fotokaarten | Prijs* | Mat papier* | Glanzend* | Extra mat* |
| | | | | | |
| PAP_950 | 10 x 10 cm | € 10,99 | - | € 1,00 | € 0,80 |
| PAP_951 | 15 x 15 cm | € 16,49 | - | € 1,50 | € 1,25 |
| PAP_952 | 10 x 15 cm | € 12,99 | - | € 1,25 | € 1,00 |
| PAP_953 | 15 x 10 cm | € 12,99 | - | € 1,25 | € 1,00 |
| PAP_954 | 13 x 19 cm | € 17,49 | - | € 1,50 | € 1,25 |
| PAP_955 | 19 x 13 cm | € 17,49 | - | € 1,50 | € 1,25 |
| | | | | | |
MUG --> MUG
| | | |
| Data-ID | Mok bedrukken | Prijs |
| | | |
| PAP_720 | Mokken | € 9,99 |
| PAP_721 | Mokken met panoramafoto | € 11,99 |
| | | |
CodePudding user response:
[I thought it would be cleaner to post this as a separate a separate answer than to edit it into the previous.]
First, let's create a list of dictionaries, each of which can be used to create a dataframe:
# (pretty much the same as before)
dataType_tables = [{
'type': t.get('data-subtype', 'NO_SUBTYPE') ' - ' t.get('data-type'),
'headers': ['Data-ID'] [
col.get_text(strip=True) for col in t.select('th')],
'data': [[r.get('data-id')] [
col.get_text(strip=True) for col in r.select('td')
] for r in t.select('tr:has(td)')]
} for t in doc.select('div[data-type]')]
and then, the list can be looped through with a combination of