In [11]:
from IPython.core.display import HTML
HTML("<style>.container { width:100% !important; float:center}</style>")


Out[11]:

In [12]:
from __future__ import division, print_function

# from sys import argv
# import os
# import glob
# import math
import re
import pandas as pd
# import numpy as np
# import scipy as sp
# import scipy.stats as sps
# import matplotlib.pyplot as plt
# import seaborn as sns
# import simplejson as jsn
import requests 
from time import sleep
import json
import re
from urllib import urlretrieve, urlopen
from urllib2 import HTTPError
from bs4 import BeautifulSoup
import datetime
import time

# %matplotlib inline

# sns.set_context('notebook')
# sns.set_style('ticks')

general


In [13]:
def OpenPage(url):
    try: 
        html = urlopen(url)
    except HTTPError as e: 
        return None

    try:
        pageData = BeautifulSoup(html, 'lxml') #,"html.parser")  #
    except AttributeError as e: 
        return None
    return pageData


def TryFind(search):
    try: 
        result = search
    except AttributeError as e: 
        return None
    if result == None: 
        return None
    return result


# def TryFind(search):
#     try: 
#         result = search
#     except AttributeError as e: 
#         return None
#     if result == None: 
#         return None
#     return result


def GetText(search):
    if TryFind(search) == None:
        return None
    else: 
        try: 
            text = TryFind(search).get_text().strip()
        except AttributeError as e: 
            return None
        if text == None: 
            return None
    return text
    
    
def GetAttribute(search, attribute):
    if TryFind(search) == None:
        return None
    else:
        try: 
            attr = TryFind(search).attrs[attribute]
        except AttributeError as e:
            return None
        if attr == None: 
            return None
        
    return attr


def GetKeys(search):
    try: 
        results = TryFind(search).attrs
    except AttributeError as e:
        return None
    
    if results == None: 
        return '0000-00-00t00:00:00'
    
    return results.keys()


def ScrapeSitemap(url):
    '''returns urls under <loc> tag in sitemap, as text string'''
    sitemap = OpenPage(url)
    taglist = sitemap.findAll('loc')
    urllist = [elem.text for elem in taglist]
    return urllist


def URLFilter(urllist, expression):
    '''filters url list via regex to eliminate non-recipe pages (category aggregations, misc posts, etc)'''
    matches = []
    for url in urllist: 
        match = re.match(expression, url)
        if match: 
            matches += [match.group(0)]
    return matches

SK-specific


In [14]:
def GetEntryDescription_SK(soup):
    '''get the stuff thats an appendage to the actual recipe body (blog-y part)'''
    
    recipe_text = []
    for paragraph in TryFind(soup.select('div.smittenkitchen-print-hide > p')):
        expression = '.*(\s)*.*[Aa]go:.*'
        if paragraph.a:
            text = paragraph.get_text().strip()
            match = re.match(expression, text)
            if match: 
                continue
            else: recipe_text += [GetText(paragraph)]
        
        else: recipe_text += [GetText(paragraph)]
    return ''.join(recipe_text)


def GetRecipe_old(soup):
    '''get directions & ingredients separately'''
    
    intro, ingredients, directions, meta = [], [], [], []
    
    for item in TryFind(soup.select('div.entry-content > p')):
        if item.br:
            ingredients += [GetText(item)]
        else: 
            directions += [GetText(item)]
    recipe_servings = 'NA'
    recipe_time = 'NA'
    intro = 'NA'

    return intro, ingredients, ''.join(directions), recipe_servings, recipe_time 


def GetRecipe_new(soup):
    '''get directions & ingredients separately'''
    intro = []
    for item in TryFind(soup.findAll('div',{'class':'jetpack-recipe-notes'})):
        if item.a: 
            intro += GetText(item)
        else: intro += GetText(item)
    intro = ''.join(intro)
    
    ingredients = []    
    for item in TryFind(soup.findAll('li',{'class':'jetpack-recipe-ingredient'})):
        ingredients += [GetText(item)]
#         if item.a: 
#             ingredients += [GetText(item)]
#         else: ingredients += [GetText(item)]

            
    directions = []
    for item in TryFind(soup.find('div',{'class':'jetpack-recipe-directions'}).findAll('p')):
        if item == None: 
            directions += 'none'
#         elif item.a: 
#             directions += [GetText(item)]
        else: 
            directions += [GetText(item)]

    recipe_servings = GetText(TryFind(soup.find('li',{'class':'jetpack-recipe-servings'})))
    recipe_time = GetText(TryFind(soup.find('li',{'class':'jetpack-recipe-time'})))
            
    return ''.join(intro), ingredients, ''.join(directions), recipe_servings, recipe_time



def GetRecipeData_SK(soup):
    '''SK underwent a site redesign; find the right way to scrape the recipe data'''
    
    if TryFind(soup.find('div',{'class':'hrecipe jetpack-recipe'})) == None: 
#         print('old')
        intro, ingredients, directions, recipe_servings, recipe_time = GetRecipe_old(soup)

    elif (TryFind(soup.find('div',{'class':'hrecipe jetpack-recipe'})) != None): 
        if (TryFind(soup.find('div',{'class':'hrecipe jetpack-recipe-notes'})) != None) & (TryFind(soup.find('div',{'class':'hrecipe jetpack-recipe-ingredient'})) != None) & (TryFind(soup.find('div',{'class':'hrecipe jetpack-recipe-directions'})) != None): 
#         print('new')
            intro, ingredients, directions, recipe_servings, recipe_time = GetRecipe_new(soup)
        
        else: 
            intro, ingredients, directions, recipe_servings, recipe_time = GetRecipe_old(soup)
    else: 
        intro, ingredients, directions, recipe_servings, recipe_time = GetRecipe_old(soup)

    return intro, ingredients, directions, recipe_servings, recipe_time

In [15]:
def GetCommentData_SK(comment, ID, children, child_id):
    '''get the data from each comment - '''
    comment_info = {}

    name = TryFind(comment.find('b',{'class':'fn author-name'}))
    if TryFind(name.find('a')) == None:
        comment_info['username'] = GetText(TryFind(comment.find('b',{'class':'fn author-name'})))
        comment_info['usersite'] = 'none'

    else: 
        comment_info['username'] = TryFind(comment.find('a')).contents[0]
        comment_info['usersite'] = TryFind(comment.find('a')).attrs['href']

        
    comment_info['usercomment'] = GetText(TryFind(comment.find('div',{'class':'comment-content'}).find('p')))
    comment_info['children'] = children
    comment_info['child_id'] = child_id
    comment_info['commentID'] = ID
    
    comment_info['title'] = TryFind(TryFind(soup.find('h1',{'class':'entry-title'})).find('a').contents[0])    
    comment_info['url'] = GetAttribute(TryFind(soup.find('h1',{'class':'entry-title'})).find('a'), 'href')
    comment_info['recipenumber'] = recipenumber
    
    timestamp_raw = GetText(soup.find('span',{'class':'date'})) +', '+ GetText(soup.find('span',{'class':'time'}))
    comment_info['comment_time'] = datetime.datetime.strptime(timestamp_raw, '%B %d, %Y, %I:%M %p')
                            # datetime.datetime.strptime(time, '%Y-%m-%dt%H:%M:%S').strftime()

    return comment_info

In [16]:
def GetComments_SK(soup, comments_total):
    '''get comments and their place in the hierarchy'''

    comments_data = {}
    comment_has_children, child_id = 'no', 0 

    allcomments = TryFind(soup.find('ol',{'class':'comment-list'}))
    number_of_comments = len(soup.findAll('article',{'class':'comment-body'}))

    comment = TryFind(allcomments.find('article',{'class':'comment-body'}))

    for counter, _ in enumerate(range(0, number_of_comments)):
        comment_ID = comments_total + counter
        nextComment = comment.findNext('article',{'class':'comment-body'})

        if counter < number_of_comments-1:
            if nextComment.parent.parent['class'][0] == 'children':
                comment_has_children, child_id = 'yes', comment_ID+1
            else: comment_has_children, child_id = 'no', 0 
        else: comment_has_children, child_id = 'no', 0 
            
        comments_data[comment_ID] = GetCommentData_SK(comment, comment_ID, comment_has_children, child_id)

        comment = comment.findNext('article')

    return comments_data, number_of_comments

In [17]:
def GetRecipe_SK(soup, ID):
    '''get all the post data from a given url'''
    recipe = {}
    recipe_data = {}
    
    recipe_data['title'] = TryFind(TryFind(soup.find('h1',{'class':'entry-title'})).find('a').contents[0])    
    recipe_data['url'] = GetAttribute(TryFind(soup.find('h1',{'class':'entry-title'})).find('a'), 'href')
    recipe_data['article_id'] = TryFind(TryFind(soup.find('article')).attrs['id'])
    recipe_data['published'] = TryFind(soup.find('time')).attrs['datetime']
    recipe_data['updated'] = TryFind(TryFind(soup.find('time',{'class':'updated'})).attrs['datetime'])
    recipe_data['author'] = TryFind(TryFind(soup.find('span',{'class':'author vcard'})).find('a').contents[0])
    recipe_data['author_url'] = GetAttribute(TryFind(soup.find('span',{'class':'author vcard'})).find('a'), 'href')
    recipe_data['numberofcomments'] = len(TryFind(soup.findAll('article',{'class':'comment-body'})))

    
    recipe_data['introductory_text'] = GetEntryDescription_SK(soup)
    
    recipe_intro, recipe_ingredients, recipe_directions, recipe_servings, recipe_time = GetRecipeData_SK(soup)
    
    recipe_data['recipe_notes'] = recipe_intro
    recipe_data['ingredients'] = recipe_ingredients
    recipe_data['directions'] = recipe_directions
    recipe_data['servings'] = recipe_servings
    recipe_data['time'] = recipe_time
    
    recipe_data['firstimageURL'] = GetAttribute(soup.find('img'), 'src')
    
    recipe[ID] = recipe_data
    
    return recipe, recipe_data['title']

set preliminaries

get URLs


In [18]:
url = 'https://smittenkitchen.com'
sk_sitemap = 'https://smittenkitchen.com/sitemap.xml'

# for SK, recipes are listed in <url>/yr/mo/<name> format, other aggregations/lists do not have this same formatting 
sk_regex = 'https://smittenkitchen.com/[0-9]{3,}.*'


urls_sk = URLFilter(ScrapeSitemap(sk_sitemap), sk_regex)

In [19]:
len(urls_sk), urls_sk[0]


Out[19]:
(984, u'https://smittenkitchen.com/2016/09/magic-apple-plum-cobbler/')

Scraper

original scraper, directly adding into pandas df

urls_temp = urls_sk[:3] CommentsFrame = pd.DataFrame() RecipeFrame = pd.DataFrame() comments_total = 0 for recipenumber, url in enumerate(urls_temp): print(len(urls_sk)-recipenumber) soup = OpenPage(url) comments, commentnumber = GetComments_SK(soup, comments_total) recipe, title = GetRecipe_SK(soup, recipenumber) CommentsFrame_temp = pd.DataFrame.from_dict(comments,orient='index') RecipeFrame_temp = pd.DataFrame.from_dict(recipe,orient='index') CommentsFrame_temp['recipeName'] = title CommentsFrame_temp['recipeID'] = recipenumber CommentsFrame_temp['recipeURL'] = url RecipeFrame_temp['numberofcomments'] = commentnumber CommentsFrame = pd.concat([CommentsFrame, CommentsFrame_temp], ignore_index=True) RecipeFrame = pd.concat([RecipeFrame, RecipeFrame_temp], ignore_index=True) time.sleep(2) CommentsFrame.to_csv('SmittenKitchen_Comments.csv', sep=',', encoding='utf-8') RecipeFrame.to_csv('SmittenKitchen_Recipes.csv', sep=',', encoding='utf-8')

scraper adding into dict instead, possibly faster?


In [24]:
# temp = urls_sk[:5]
comments_all, recipes_all = {}, {}
comments_total = 0

for recipenumber, url in enumerate(urls_sk): 
    print(len(urls_sk)-recipenumber)
    soup = OpenPage(url)
    
    comments, commentnumber = GetComments_SK(soup, comments_total)
    recipe, title = GetRecipe_SK(soup, recipenumber)
#     recipe, title = GetRecipe_SK(soup, recipenumber)
    
    recipes_all.update(recipe)
    comments_all.update(comments)
    
    comments_total += commentnumber


#     CommentsFrame = pd.concat([CommentsFrame, CommentsFrame_temp], ignore_index=True)
#     RecipeFrame = pd.concat([RecipeFrame, RecipeFrame_temp], ignore_index=True)   

    time.sleep(2)

    
comments_smittenkitchen = pd.DataFrame.from_dict(comments_all).T
recipes_smittenkitchen = pd.DataFrame.from_dict(recipes_all).T

comments_smittenkitchen.to_csv('comments_smittenkitchen.csv', sep=',', encoding='utf-8')
recipes_smittenkitchen.to_csv('recipes_smittenkitchen.csv', sep=',', encoding='utf-8')


984
983
982
981
980
979
978
977
976
975
974
973
972
971
970
969
968
967
966
965
964
963
962
961
960
959
958
957
956
955
954
953
952
951
950
949
948
947
946
945
944
943
942
941
940
939
938
937
936
935
934
933
932
931
930
929
928
927
926
925
924
923
922
921
920
919
918
917
916
915
914
913
912
911
910
909
908
907
906
905
904
903
902
901
900
899
898
897
896
895
894
893
892
891
890
889
888
887
886
885
884
883
882
881
880
879
878
877
876
875
874
873
872
871
870
869
868
867
866
865
864
863
862
861
860
859
858
857
856
855
854
853
852
851
850
849
848
847
846
845
844
843
842
841
840
839
838
837
836
835
834
833
832
831
830
829
828
827
826
825
824
823
822
821
820
819
818
817
816
815
814
813
812
811
810
809
808
807
806
805
804
803
802
801
800
799
798
797
796
795
794
793
792
791
790
789
788
787
786
785
784
783
782
781
780
779
778
777
776
775
774
773
772
771
770
769
768
767
766
765
764
763
762
761
760
759
758
757
756
755
754
753
752
751
750
749
748
747
746
745
744
743
742
741
740
739
738
737
736
735
734
733
732
731
730
729
728
727
726
725
724
723
722
721
720
719
718
717
716
715
714
713
712
711
710
709
708
707
706
705
704
703
702
701
700
699
698
697
696
695
694
693
692
691
690
689
688
687
686
685
684
683
682
681
680
679
678
677
676
675
674
673
672
671
670
669
668
667
666
665
664
663
662
661
660
659
658
657
656
655
654
653
652
651
650
649
648
647
646
645
644
643
642
641
640
639
638
637
636
635
634
633
632
631
630
629
628
627
626
625
624
623
622
621
620
619
618
617
616
615
614
613
612
611
610
609
608
607
606
605
604
603
602
601
600
599
598
597
596
595
594
593
592
591
590
589
588
587
586
585
584
583
582
581
580
579
578
577
576
575
574
573
572
571
570
569
568
567
566
565
564
563
562
561
560
559
558
557
556
555
554
553
552
551
550
549
548
547
546
545
544
543
542
541
540
539
538
537
536
535
534
533
532
531
530
529
528
527
526
525
524
523
522
521
520
519
518
517
516
515
514
513
512
511
510
509
508
507
506
505
504
503
502
501
500
499
498
497
496
495
494
493
492
491
490
489
488
487
486
485
484
483
482
481
480
479
478
477
476
475
474
473
472
471
470
469
468
467
466
465
464
463
462
461
460
459
458
457
456
455
454
453
452
451
450
449
448
447
446
445
444
443
442
441
440
439
438
437
436
435
434
433
432
431
430
429
428
427
426
425
424
423
422
421
420
419
418
417
416
415
414
413
412
411
410
409
408
407
406
405
404
403
402
401
400
399
398
397
396
395
394
393
392
391
390
389
388
387
386
385
384
383
382
381
380
379
378
377
376
375
374
373
372
371
370
369
368
367
366
365
364
363
362
361
360
359
358
357
356
355
354
353
352
351
350
349
348
347
346
345
344
343
342
341
340
339
338
337
336
335
334
333
332
331
330
329
328
327
326
325
324
323
322
321
320
319
318
317
316
315
314
313
312
311
310
309
308
307
306
305
304
303
302
301
300
299
298
297
296
295
294
293
292
291
290
289
288
287
286
285
284
283
282
281
280
279
278
277
276
275
274
273
272
271
270
269
268
267
266
265
264
263
262
261
260
259
258
257
256
255
254
253
252
251
250
249
248
247
246
245
244
243
242
241
240
239
238
237
236
235
234
233
232
231
230
229
228
227
226
225
224
223
222
221
220
219
218
217
216
215
214
213
212
211
210
209
208
207
206
205
204
203
202
201
200
199
198
197
196
195
194
193
192
191
190
189
188
187
186
185
184
183
182
181
180
179
178
177
176
175
174
173
172
171
170
169
168
167
166
165
164
163
162
161
160
159
158
157
156
155
154
153
152
151
150
149
148
147
146
145
144
143
142
141
140
139
138
137
136
135
134
133
132
131
130
129
128
127
126
125
124
123
122
121
120
119
118
117
116
115
114
113
112
111
110
109
108
107
106
105
104
103
102
101
100
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
80
79
78
77
76
75
74
73
72
71
70
69
68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1

testing

comments_smittenkitchen = pd.DataFrame.from_dict(comments_all).T recipes_smittenkitchen = pd.DataFrame.from_dict(recipes_all).T comments_smittenkitchen.to_csv('comments_smittenkitchen_100_2.csv', sep=',', encoding='utf-8') recipes_smittenkitchen.to_csv('recipes_smittenkitchen_100_2.csv', sep=',', encoding='utf-8')
comments_smittenkitchen = pd.DataFrame.from_dict(comments_all).T recipes_smittenkitchen = pd.DataFrame.from_dict(recipes_all).T comments_smittenkitchen.to_csv('comments_smittenkitchen_479.csv', sep=',', encoding='utf-8') recipes_smittenkitchen.to_csv('recipes_smittenkitchen_479.csv', sep=',', encoding='utf-8')

In [ ]:


In [25]:
recipes_smittenkitchen.numberofcomments.sum()


Out[25]:
227818
recipes_smittenkitchen[recipes_smittenkitchen.title =='hazelnut truffles'].url

In [27]:
comments_smittenkitchen


Out[27]:
child_id children commentID comment_time recipenumber title url usercomment username usersite
0 0 no 0 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This looks perfect for Rosh or Yom… sweet for ... SallyT none
1 0 no 1 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... I just recently discovered that peaches and gr... mimi none
2 3 yes 2 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... As an Englishman, a cobbler to me has always i... Alan Quatermain none
3 4 yes 3 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... cobbles of scones…”cobblescones”, if you will? Jilly none
4 0 no 4 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... lol lol lol lol Kate none
5 0 no 5 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Love the pan! Do you mind sharing the source? gayu none
6 0 no 6 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is the recipe, more or less, I learned fr... ronda1227 none
7 0 no 7 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is pretty much what I grew up having as c... Heather none
8 9 yes 8 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... We’re going apple picking this weekend. No rea... Sarah none
9 0 no 9 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Absolutely. deb http://smittenkitchen.com
10 0 no 10 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Hooray for plum season! I recently made the fa... eatsbyem http://eatsbyem.wordpress.com
11 0 no 11 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... My birthday is on Sunday, and I think I would ... Maureen @Raising The Capable Student http://www.thecapablestudent.com/
12 0 no 12 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is my favorite kind of cobbler! I make i... Cary none
13 0 no 13 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... I’ve been cooking for sixty plus years, and ha... Carol none
14 0 no 14 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is the same recipe (sans cinnamon) my mot... Carrie none
15 0 no 15 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... OMG. I hope there’s still plums around here so... Considering The Radish http://consideringtheradish.wordpress.com
16 17 yes 16 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... You cut the fruit up after the batter is poure... Megan none
17 0 no 17 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Yes, it’s fine for a little bit — shouldn’t ta... deb http://smittenkitchen.com
18 0 no 18 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... I’m over sixty and grew up in Kentucky. My fam... Patty K none
19 20 yes 19 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This looks fabulous, can’t wait to try it! FYI... Camille Kite none
20 0 no 20 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Gah! Thanks, now fixed. deb http://smittenkitchen.com
21 0 no 21 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This will be my breakfast this weekend :D Marta @ What should I eat for breakfast today http://whatshouldieatforbreakfasttoday.com/
22 0 no 22 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... My family makes this! My grandmother heard the... Whitney none
23 0 no 23 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is how I’ve been making cobbler since I w... laura none
24 0 no 24 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... If I remember correctly, boxes of Bisquick use... Marcia none
25 0 no 25 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... Can only imagine that this would be delicious ... JP none
26 0 no 26 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... It’s in the oven! Mary none
27 28 yes 27 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... OMG! I made this as soon as I finished readin... Amhem none
28 0 no 28 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... BTW, as someone who lives hours away from a gr... Amhem none
29 0 no 29 2016-09-16 12:12:00 0 magic apple plum cobbler https://smittenkitchen.com/2016/09/magic-apple... This is so delicious I made it tonight, can’t ... spanky58 none
... ... ... ... ... ... ... ... ... ... ...
227788 0 no 227788 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I made this recently and the syrup was delicio... Anna none
227789 0 no 227789 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Anna — We have a SodaStream and I’ve never had... deb http://smittenkitchen.com
227790 0 no 227790 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Hi – I made the syrup this morning with fresh-... Martha http://allthedirtongardening.blogspot.com/
227791 0 no 227791 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I made this recently and every time I open the... Wife To An Amazing Cook none
227792 0 no 227792 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I made this last week (it’s amazing!) and am j... Maro none
227793 0 no 227793 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Deb-\nI’ve also just discovered that putting t... Sarah none
227794 0 no 227794 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Maro — It might be good to look at a banana br... deb http://smittenkitchen.com
227795 0 no 227795 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... thanks, Deb! banana was going to be my default... Maro none
227796 0 no 227796 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Strawberry-Rhubarb-Ginger-Cardamom! It took al... Maro none
227797 0 no 227797 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Made this last night and I’m not sure if my rh... Jeni none
227798 0 no 227798 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Lindsey – it’s not just you. I’ve made it twic... Kalle none
227799 0 no 227799 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Lindsey, Kalle — I suppose the only logical an... deb http://smittenkitchen.com
227800 0 no 227800 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Just made this yummy syrup after a trip to Uni... sue none
227801 0 no 227801 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Hi Sue — Yes, Specialty Bottles all the way! deb http://smittenkitchen.com
227802 0 no 227802 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Um, I’m sure you already know this, but leftov... Julie none
227803 0 no 227803 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Here’s a recipe for the leftover pulp: Freeze ... AJ none
227804 0 no 227804 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I made this a week ago… and drank all of it my... Becca http://tencansbeans.blogspot.com
227805 0 no 227805 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... oh wow, yum! love it! I didnt measure the fr... Eliza none
227806 0 no 227806 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Reporting back to say: I have succesfully kept... Mina none
227807 0 no 227807 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Deb, per comment 212 – yes! It was thick, but ... Lindsey none
227808 0 no 227808 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... omg, this is awesome!!! I do my own canning a... Barbs none
227809 0 no 227809 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Just made this. It bubbled on the stove while... Katherine none
227810 0 no 227810 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I’ve never used this method before and have fa... Christian none
227811 0 no 227811 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... I love your comment feed. It’s an added bonus ... lindsay none
227812 0 no 227812 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... We love this! I just froze some strawberries ... Sarah none
227813 0 no 227813 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... This is a great base for some great summer coc... Bryan none
227814 0 no 227814 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Absolutely fabulous!! Made it last night and ... Louise none
227815 0 no 227815 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Love this syrup! I made it yesterday evening ... Loretta none
227816 0 no 227816 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... So I don’t do oatmeal much, but I ran the left... Matthew https://nontrivialproblems.wordpress.com/
227817 0 no 227817 2015-04-10 12:04:00 983 strawberry rhubarb soda syrup https://smittenkitchen.com/2015/04/strawberry-... Wow, this is an amazing recipe. The fruit stuf... Erin none

227818 rows × 10 columns