bookshark 1.0.0.pre.2 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -30
  3. data/bookshark.gemspec +1 -0
  4. data/lib/bookshark.rb +35 -7
  5. data/lib/bookshark/crawlers/base.rb +11 -9
  6. data/lib/bookshark/crawlers/bibliographical_record_crawler.rb +43 -0
  7. data/lib/bookshark/crawlers/book_crawler.rb +42 -54
  8. data/lib/bookshark/extractors/bibliographical_book_extractor.rb +57 -35
  9. data/lib/bookshark/extractors/book_extractor.rb +9 -1
  10. data/lib/bookshark/storage/json_book_records/0/book_63.json +61 -0
  11. data/lib/bookshark/storage/json_book_records/0/book_67.json +53 -0
  12. data/lib/bookshark/storage/json_book_records/2/book_2110.json +59 -0
  13. data/lib/bookshark/storage/json_book_records/2/book_2111.json +65 -0
  14. data/lib/bookshark/storage/json_book_records/2/book_2112.json +69 -0
  15. data/lib/bookshark/storage/json_book_records/2/book_2113.json +59 -0
  16. data/lib/bookshark/storage/json_book_records/2/book_2114.json +67 -0
  17. data/lib/bookshark/storage/json_book_records/2/book_2115.json +71 -0
  18. data/lib/bookshark/storage/json_book_records/2/book_2116.json +63 -0
  19. data/lib/bookshark/storage/json_book_records/2/book_2117.json +61 -0
  20. data/lib/bookshark/storage/json_book_records/2/book_2118.json +83 -0
  21. data/lib/bookshark/storage/json_book_records/2/book_2119.json +69 -0
  22. data/lib/bookshark/storage/json_book_records/2/book_2120.json +69 -0
  23. data/lib/bookshark/storage/json_book_records/2/book_2121.json +63 -0
  24. data/lib/bookshark/storage/json_book_records/2/book_2122.json +72 -0
  25. data/lib/bookshark/storage/json_book_records/2/book_2123.json +67 -0
  26. data/lib/bookshark/storage/json_book_records/2/book_2124.json +72 -0
  27. data/lib/bookshark/storage/json_book_records/2/book_2125.json +67 -0
  28. data/lib/bookshark/storage/json_book_records/2/book_2126.json +72 -0
  29. data/lib/bookshark/storage/json_book_records/2/book_2127.json +61 -0
  30. data/lib/bookshark/storage/json_book_records/2/book_2128.json +61 -0
  31. data/lib/bookshark/storage/json_book_records/2/book_2129.json +61 -0
  32. data/lib/bookshark/storage/json_book_records/2/book_2130.json +72 -0
  33. data/lib/bookshark/storage/json_book_records/2/book_2131.json +55 -0
  34. data/lib/bookshark/storage/json_book_records/2/book_2132.json +61 -0
  35. data/lib/bookshark/storage/json_book_records/2/book_2133.json +61 -0
  36. data/lib/bookshark/storage/json_book_records/2/book_2134.json +61 -0
  37. data/lib/bookshark/storage/json_book_records/2/book_2135.json +55 -0
  38. data/lib/bookshark/storage/json_book_records/2/book_2136.json +67 -0
  39. data/lib/bookshark/storage/json_book_records/2/book_2137.json +67 -0
  40. data/lib/bookshark/storage/json_book_records/2/book_2138.json +57 -0
  41. data/lib/bookshark/storage/json_book_records/2/book_2139.json +67 -0
  42. data/lib/bookshark/storage/json_book_records/2/book_2140.json +53 -0
  43. data/lib/bookshark/storage/json_book_records/2/book_2141.json +61 -0
  44. data/lib/bookshark/storage/json_book_records/2/book_2142.json +67 -0
  45. data/lib/bookshark/storage/json_book_records/2/book_2143.json +65 -0
  46. data/lib/bookshark/storage/json_book_records/2/book_2144.json +64 -0
  47. data/lib/bookshark/storage/json_book_records/2/book_2145.json +53 -0
  48. data/lib/bookshark/storage/json_book_records/2/book_2146.json +70 -0
  49. data/lib/bookshark/storage/json_book_records/2/book_2147.json +67 -0
  50. data/lib/bookshark/storage/json_book_records/2/book_2148.json +66 -0
  51. data/lib/bookshark/storage/json_book_records/2/book_2149.json +72 -0
  52. data/lib/bookshark/storage/json_book_records/2/book_2150.json +53 -0
  53. data/lib/bookshark/storage/json_book_records/2/book_2151.json +67 -0
  54. data/lib/bookshark/storage/json_book_records/2/book_2152.json +67 -0
  55. data/lib/bookshark/storage/json_book_records/2/book_2153.json +67 -0
  56. data/lib/bookshark/storage/json_book_records/2/book_2154.json +67 -0
  57. data/lib/bookshark/storage/json_book_records/2/book_2155.json +67 -0
  58. data/lib/bookshark/storage/json_book_records/2/book_2156.json +76 -0
  59. data/lib/bookshark/storage/json_book_records/2/book_2157.json +65 -0
  60. data/lib/bookshark/storage/json_book_records/2/book_2158.json +77 -0
  61. data/lib/bookshark/storage/json_book_records/2/book_2159.json +76 -0
  62. data/lib/bookshark/storage/json_book_records/2/book_2160.json +67 -0
  63. data/lib/bookshark/storage/json_book_records/2/book_2161.json +61 -0
  64. data/lib/bookshark/storage/json_book_records/2/book_2162.json +65 -0
  65. data/lib/bookshark/storage/json_book_records/2/book_2163.json +68 -0
  66. data/lib/bookshark/storage/json_book_records/2/book_2164.json +59 -0
  67. data/lib/bookshark/storage/json_book_records/2/book_2165.json +59 -0
  68. data/lib/bookshark/storage/json_book_records/2/book_2166.json +53 -0
  69. data/lib/bookshark/storage/json_book_records/2/book_2167.json +53 -0
  70. data/lib/bookshark/storage/json_book_records/2/book_2168.json +53 -0
  71. data/lib/bookshark/storage/json_book_records/2/book_2169.json +53 -0
  72. data/lib/bookshark/storage/json_book_records/2/book_2170.json +53 -0
  73. data/lib/bookshark/version.rb +1 -1
  74. data/spec/bookshark_spec.rb +62 -46
  75. data/spec/spec_helper.rb +2 -1
  76. data/spec/test_data/bg_record_103788.html +1 -0
  77. data/spec/test_data/book_103788.html +1 -0
  78. metadata +88 -5
@@ -5,31 +5,31 @@ require_relative 'base'
5
5
 
6
6
 
7
7
  module Biblionet
8
- module Extractors
9
-
10
- class BibliographicalBookExtractor < Base
8
+ module Extractors
9
+
10
+ class BibliographicalBookExtractor < Base
11
11
  attr_reader :bibliographical_book
12
12
 
13
13
  def initialize(uri=nil)
14
- super(uri)
15
- extract_bibliographical_book unless uri.nil? or @page.nil?
14
+ super(uri)
15
+ extract_bibliographical_book unless uri.nil? or @page.nil?
16
16
  end
17
17
 
18
18
  def load_and_extract_book(uri=nil)
19
19
  load_page(uri)
20
20
  extract_bibliographical_book unless uri.nil? or @page.nil?
21
- end
21
+ end
22
22
 
23
- def extract_bibliographical_book(biblionet_id=@biblionet_id, book_page=@page)
23
+ def extract_bibliographical_book(biblionet_id=@biblionet_id, book_page=@page)
24
24
  # log = Logger.new(File.new(File.dirname(__dir__).to_s + "/logs/book_parsing.log",'a+'))
25
25
  log = Logger.new(STDOUT)
26
-
26
+
27
27
  page = BibliographicalBookDataExtractor.new(book_page)
28
28
 
29
29
  # End extraction if BookDataExtractor couldnt create a nodeset
30
30
  return nil if page.nodeset.nil?
31
31
 
32
- bibliographical_book_hash = Hash.new
32
+ bibliographical_book_hash = Hash.new
33
33
 
34
34
  extracted_details = page.details
35
35
 
@@ -47,7 +47,7 @@ module Biblionet
47
47
 
48
48
  bibliographical_book_hash[:publisher] = extracted_details[:publisher]
49
49
  bibliographical_book_hash[:publication] = extracted_details[:publication]
50
-
50
+
51
51
  return @bibliographical_book = bibliographical_book_hash
52
52
  end
53
53
 
@@ -63,14 +63,14 @@ module Biblionet
63
63
  puts document
64
64
  end
65
65
  content = content_re.match(document)[0] unless (content_re.match(document)).nil?
66
-
66
+
67
67
  # If content is nil, there is something wrong with the html, so return nil
68
68
  if content.nil?
69
69
  @nodeset = nil
70
70
  else
71
- @nodeset = Nokogiri::HTML(content)
72
- end
73
- end
71
+ @nodeset = Nokogiri::HTML(content)
72
+ end
73
+ end
74
74
 
75
75
  def size
76
76
  size_regex = /\d+x\d+/
@@ -101,19 +101,19 @@ module Biblionet
101
101
  original_title = detail.gsub(/Τίτλος πρωτοτύπου:/, "").strip
102
102
  details_hash[:original_title] = original_title
103
103
  end
104
-
105
- details_hash[:isbn] = detail[isbn_regex] if detail =~ isbn_regex
104
+
105
+ details_hash[:isbn] = detail[isbn_regex] if detail =~ isbn_regex
106
106
 
107
107
  details_hash[:isbn_13] = detail[isbn_13_regex] if detail =~ isbn_13_regex
108
108
 
109
- details_hash[:last_update] = detail[last_update_regex] if detail =~ last_update_regex
109
+ details_hash[:last_update] = detail[last_update_regex] if detail =~ last_update_regex
110
110
 
111
- details_hash[:cover_type] = detail[cover_type_regex] if detail =~ cover_type_regex
111
+ details_hash[:cover_type] = detail[cover_type_regex] if detail =~ cover_type_regex
112
112
 
113
113
  details_hash[:availability] = detail[availability_regex] if detail =~ availability_regex
114
114
 
115
- details_hash[:price] = detail[price_regex] if detail =~ price_regex
116
-
115
+ details_hash[:price] = detail[price_regex] if detail =~ price_regex
116
+
117
117
  end
118
118
 
119
119
  pre_details_text = @nodeset.xpath("//span[@class='small'][1]/preceding::text()").text
@@ -123,13 +123,13 @@ module Biblionet
123
123
  series_regex_no_vol = /(?<=\()\p{Word}+( \S)?( \p{Word}+( \S)?)*(?=\))/
124
124
  series_name_regex = /\p{Word}+( \S)?( \p{Word}+( \S)?)*(?= ·)/
125
125
  series_volume_regex = /(?<=· )\d+/
126
- physical_size_regex = /\d+x\d+/
126
+ physical_size_regex = /\d+x\d+/
127
127
 
128
128
  series_hash = {}
129
129
  if pre_details_text =~ series_regex
130
130
  series = pre_details_text[series_regex]
131
131
  series_hash[:name] = series[series_name_regex] if series =~ series_name_regex
132
- series_hash[:volume] = series[series_volume_regex] if series =~ series_volume_regex
132
+ series_hash[:volume] = series[series_volume_regex] if series =~ series_volume_regex
133
133
  elsif pre_details_text =~ series_regex_no_vol
134
134
  series = pre_details_text[series_regex_no_vol]
135
135
  series_hash[:name] = series
@@ -137,7 +137,7 @@ module Biblionet
137
137
  end
138
138
 
139
139
  details_hash[:series] = series_hash
140
-
140
+
141
141
  details_hash[:physical_size] = (pre_details_text =~ physical_size_regex) ? pre_details_text[physical_size_regex] : nil
142
142
 
143
143
  format_regex = /(?<=\[).+(?=\])/
@@ -148,20 +148,42 @@ module Biblionet
148
148
  details_hash[:format] = format.nil? ? 'Βιβλίο' : format
149
149
 
150
150
  publisher_node = @nodeset.xpath("//a[@class='booklink' and @href[contains(.,'/com/') ]][1]").first
151
- publisher_hash = {}
152
- publisher_hash[:text] = publisher_node.text
153
- publisher_hash[:b_id] = (publisher_node[:href].split("/"))[2]
151
+ if !publisher_node.nil?
152
+ publisher_hash = {}
153
+ publisher_hash[:text] = publisher_node.text
154
+ publisher_hash[:b_id] = (publisher_node[:href].split("/"))[2]
154
155
 
155
- pre_publisher_text = BibliographicalBookExtractor.decode_text(publisher_node.previous_sibling.text)
156
- after_publisher_text = BibliographicalBookExtractor.decode_text(publisher_node.next_sibling.text)
156
+ pre_publisher_text = BibliographicalBookExtractor.decode_text(publisher_node.previous_sibling.text)
157
+ after_publisher_text = BibliographicalBookExtractor.decode_text(publisher_node.next_sibling.text)
157
158
 
158
- publication_hash = {}
159
- publication_hash[:year] = after_publisher_text[/(?<=, )\d+(?=\.)/]
160
- publication_hash[:version] = pre_details_text[/(?<=- )\d+(?=η)/]
161
- publication_hash[:place] = pre_details_text[/(?<=- )\p{Word}+( \S)?( \p{Word}+( \S)?)*(?= :)/]
159
+ publication_hash = {}
160
+ publication_hash[:year] = after_publisher_text[/(?<=, )\d+(?=\.)/]
161
+ publication_hash[:version] = pre_details_text[/(?<=- )\d+(?=η)/]
162
+ publication_hash[:place] = pre_details_text[/(?<=- )\p{Word}+( \S)?( \p{Word}+( \S)?)*(?= :)/]
162
163
 
163
- details_hash[:publisher] = publisher_hash
164
- details_hash[:publication] = publication_hash
164
+ details_hash[:publisher] = publisher_hash
165
+ details_hash[:publication] = publication_hash
166
+ else
167
+ publisher_node = @nodeset.xpath("//a[@class='subjectlink' and @href[contains(.,'/com/') ]][1]").first
168
+ if !publisher_node.nil?
169
+ details_hash[:publisher] = {
170
+ text: publisher_node.text,
171
+ b_id: (publisher_node[:href].split("/"))[2]
172
+ }
173
+ after_last_author_text = @nodeset
174
+ .xpath("//a[@class='booklink' and @href[contains(.,'/author/') ]][last()]").last
175
+ .next_sibling.text.strip
176
+ puts after_last_author_text
177
+ details_hash[:publication] = {
178
+ year: after_last_author_text[/(?<=: )\d+(?=\.)/],
179
+ version: after_last_author_text[/(?<=- )\d+(?=η)/],
180
+ place: after_last_author_text[/(?<=- )\p{Word}+( \S)?( \p{Word}+( \S)?)*(?= :)/]
181
+ }
182
+ else
183
+ details_hash[:publisher] = {text: nil, b_id: nil}
184
+ details_hash[:publication] = {year: nil, version: nil, place: nil}
185
+ end
186
+ end
165
187
 
166
188
  details_hash
167
189
  end
@@ -169,4 +191,4 @@ module Biblionet
169
191
  end
170
192
 
171
193
  end
172
- end
194
+ end
@@ -206,7 +206,15 @@ module Biblionet
206
206
  book_hash[:category] = ddcs
207
207
  book_hash[:b_id] = biblionet_id
208
208
 
209
- uri = "http://www.biblionet.gr/main.asp?page=results&Titlesid=#{biblionet_id}"
209
+ uri = nil
210
+
211
+ if @url
212
+ uri = "http://www.biblionet.gr/main.asp?page=results&Titlesid=#{biblionet_id}"
213
+ elsif @filepath
214
+ uri = File.dirname(@filepath) + "/" + "bg_record_#{biblionet_id}.html"
215
+ end
216
+
217
+ # uri = "http://www.biblionet.gr/main.asp?page=results&Titlesid=#{biblionet_id}"
210
218
 
211
219
  bibliographical_book_extractor = Biblionet::Extractors::BibliographicalBookExtractor.new
212
220
  bibliographical_details = bibliographical_book_extractor.load_and_extract_book(uri)
@@ -0,0 +1,61 @@
1
+ {
2
+ "book": [
3
+ {
4
+ "title": "Μέσα από το σκοτεινό καθρέφτη",
5
+ "subtitle": null,
6
+ "image": "http://www.biblionet.gr/images/covers/b63.jpg",
7
+ "author": [
8
+ {
9
+ "name": "Γιοστέιν Γκάαρντερ",
10
+ "b_id": "507"
11
+ }
12
+ ],
13
+ "contributors": {
14
+ "μετάφραση": [
15
+ {
16
+ "name": "Μαρία Αγγελίδου",
17
+ "b_id": "796"
18
+ }
19
+ ]
20
+ },
21
+ "publisher": {
22
+ "text": "Εκδοτικός Οίκος Α. Α. Λιβάνη",
23
+ "b_id": "271"
24
+ },
25
+ "isbn": "960-236-891-8",
26
+ "isbn_13": "978-960-236-891-6",
27
+ "award": [
28
+
29
+ ],
30
+ "description": "\"Bλέπουμε τον κόσμο μέσα από έναν καθρέφτη. Kι είναι ο κόσμος ένα μεγάλο μυστήριο για μας: \"Δι' εσόπτρου εν αινίγματι\". Kαμιά φορά καταφέρνουμε να ρίξουμε μια ματιά απ' την άλλη μεριά,να δούμε τι κρύβεται πίσω απ' τον καθρέφτη. Aν καθαρίζαμε όλο τον καθρέφτη και τον κάναμε γυαλί διάφανο, θα βλέπαμε φυσικά πολύ περισσότερα πράγματα. Mόνο που δε θα μπορούσαμε πια να δούμε τον εαυτό μας. Γιατί το γυαλί δε θα 'ταν πια καθρέφτης...\" <br>",
31
+ "category": [
32
+ {
33
+ "ddc": "839.82",
34
+ "name": "Νορβηγική πεζογραφία - Μυθιστόρημα",
35
+ "b_id": "400"
36
+ }
37
+ ],
38
+ "b_id": "63",
39
+ "publication": {
40
+ "year": "1998",
41
+ "version": null,
42
+ "place": "Αθήνα"
43
+ },
44
+ "format": "Βιβλίο",
45
+ "original_language": "νορβηγικά",
46
+ "original_title": "I et speil, i en gåte",
47
+ "price": "14,85",
48
+ "availability": "Κυκλοφορεί",
49
+ "last_update": null,
50
+ "series": {
51
+ "name": "Ξένη Λογοτεχνία",
52
+ "volume": null
53
+ },
54
+ "physical_description": {
55
+ "pages": "267",
56
+ "size": "21x14",
57
+ "cover_type": "Μαλακό εξώφυλλο"
58
+ }
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "book": [
3
+ {
4
+ "title": "Ο χορός των ωρών",
5
+ "subtitle": "Διηγήματα",
6
+ "image": "http://www.biblionet.gr/images/covers/b67.jpg",
7
+ "author": [
8
+ {
9
+ "name": "Τσιτσέλη Καίη 1926-2001",
10
+ "b_id": "74"
11
+ }
12
+ ],
13
+ "contributors": {
14
+ },
15
+ "publisher": {
16
+ "text": "Άγρα",
17
+ "b_id": "44"
18
+ },
19
+ "isbn": "960-325-281-6",
20
+ "isbn_13": "978-960-325-281-8",
21
+ "award": [
22
+
23
+ ],
24
+ "description": null,
25
+ "category": [
26
+ {
27
+ "ddc": "889.3",
28
+ "name": "Νεοελληνική πεζογραφία - Διήγημα",
29
+ "b_id": "3"
30
+ }
31
+ ],
32
+ "b_id": "67",
33
+ "publication": {
34
+ "year": "1998",
35
+ "version": null,
36
+ "place": "Αθήνα"
37
+ },
38
+ "format": "Βιβλίο",
39
+ "original_language": null,
40
+ "original_title": null,
41
+ "price": "11,15",
42
+ "availability": "Κυκλοφορεί",
43
+ "last_update": "5/7/2007",
44
+ "series": {
45
+ },
46
+ "physical_description": {
47
+ "pages": "153",
48
+ "size": "17x11",
49
+ "cover_type": "Μαλακό εξώφυλλο"
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "book": [
3
+ {
4
+ "title": "Kreta - Mir ist, Als Wurde Ich Heimkehren",
5
+ "subtitle": null,
6
+ "image": null,
7
+ "author": [
8
+ {
9
+ "name": "Karin Guse",
10
+ "b_id": "879"
11
+ }
12
+ ],
13
+ "contributors": {
14
+ "φωτογράφιση": [
15
+ {
16
+ "name": "Karin Guse",
17
+ "b_id": "879"
18
+ }
19
+ ]
20
+ },
21
+ "publisher": {
22
+ "text": "Ευσταθιάδης Group",
23
+ "b_id": "101"
24
+ },
25
+ "isbn": "960-226-521-3",
26
+ "isbn_13": "978-960-226-521-5",
27
+ "award": [
28
+
29
+ ],
30
+ "description": null,
31
+ "category": [
32
+ {
33
+ "ddc": "914.9504",
34
+ "name": "Κρήτη - Περιγραφή και ταξίδια - Οδηγοί",
35
+ "b_id": "110"
36
+ }
37
+ ],
38
+ "b_id": "2110",
39
+ "publication": {
40
+ "year": "1998",
41
+ "version": null,
42
+ "place": "Αθήνα"
43
+ },
44
+ "format": "Βιβλίο",
45
+ "original_language": null,
46
+ "original_title": null,
47
+ "price": "4,46",
48
+ "availability": "Κυκλοφορεί",
49
+ "last_update": null,
50
+ "series": {
51
+ },
52
+ "physical_description": {
53
+ "pages": "79",
54
+ "size": "18x12",
55
+ "cover_type": "Μαλακό εξώφυλλο"
56
+ }
57
+ }
58
+ ]
59
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "book": [
3
+ {
4
+ "title": "Athens - Attica",
5
+ "subtitle": "General Guide",
6
+ "image": null,
7
+ "author": [
8
+ {
9
+ "name": "John Bowman",
10
+ "b_id": "578"
11
+ }
12
+ ],
13
+ "contributors": {
14
+ "φωτογράφιση": [
15
+ {
16
+ "name": "A. Spyropoulos",
17
+ "b_id": "1195"
18
+ },
19
+ {
20
+ "name": "G. Sfikas",
21
+ "b_id": "15982"
22
+ }
23
+ ]
24
+ },
25
+ "publisher": {
26
+ "text": "Ευσταθιάδης Group",
27
+ "b_id": "101"
28
+ },
29
+ "isbn": "960-226-378-4",
30
+ "isbn_13": "978-960-226-378-5",
31
+ "award": [
32
+
33
+ ],
34
+ "description": null,
35
+ "category": [
36
+ {
37
+ "ddc": "910.49512",
38
+ "name": "Αθήνα - Οδηγοί",
39
+ "b_id": "198"
40
+ }
41
+ ],
42
+ "b_id": "2111",
43
+ "publication": {
44
+ "year": "1998",
45
+ "version": null,
46
+ "place": "Attica"
47
+ },
48
+ "format": "Βιβλίο",
49
+ "original_language": null,
50
+ "original_title": null,
51
+ "price": "5,07",
52
+ "availability": "Κυκλοφορεί",
53
+ "last_update": null,
54
+ "series": {
55
+ "name": "Argonaut Pocket Guide",
56
+ "volume": null
57
+ },
58
+ "physical_description": {
59
+ "pages": "214",
60
+ "size": "18x12",
61
+ "cover_type": "Μαλακό εξώφυλλο"
62
+ }
63
+ }
64
+ ]
65
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "book": [
3
+ {
4
+ "title": "Raubvögel in Griechenland",
5
+ "subtitle": null,
6
+ "image": null,
7
+ "author": [
8
+ {
9
+ "name": "G. Handrinos",
10
+ "b_id": "1185"
11
+ },
12
+ {
13
+ "name": "A. Dimitropoulos",
14
+ "b_id": "1186"
15
+ }
16
+ ],
17
+ "contributors": {
18
+ "εικονογράφηση": [
19
+ {
20
+ "name": "Ach. Dimitropoulos",
21
+ "b_id": "1186"
22
+ },
23
+ {
24
+ "name": "G. Handrinos",
25
+ "b_id": "1185"
26
+ }
27
+ ]
28
+ },
29
+ "publisher": {
30
+ "text": "Ευσταθιάδης Group",
31
+ "b_id": "101"
32
+ },
33
+ "isbn": "960-226-576-0",
34
+ "isbn_13": "978-960-226-576-5",
35
+ "award": [
36
+
37
+ ],
38
+ "description": null,
39
+ "category": [
40
+ {
41
+ "ddc": "598.495",
42
+ "name": "Πουλιά - Ελλάς",
43
+ "b_id": "205"
44
+ }
45
+ ],
46
+ "b_id": "2112",
47
+ "publication": {
48
+ "year": "1999",
49
+ "version": null,
50
+ "place": "Αθήνα"
51
+ },
52
+ "format": "Βιβλίο",
53
+ "original_language": null,
54
+ "original_title": null,
55
+ "price": "9,83",
56
+ "availability": "Κυκλοφορεί",
57
+ "last_update": null,
58
+ "series": {
59
+ "name": "Griechenlands Natur",
60
+ "volume": null
61
+ },
62
+ "physical_description": {
63
+ "pages": "199",
64
+ "size": "18x12",
65
+ "cover_type": "Μαλακό εξώφυλλο"
66
+ }
67
+ }
68
+ ]
69
+ }