Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to BS4

Intro to BS4

Python CodeLabs - Python bs4 - Introduction to BeautifulSoup
http://eueung.github.io/python/bs4

Eueung Mulyana

December 06, 2015
Tweet

More Decks by Eueung Mulyana

Other Decks in Programming

Transcript

  1. Example #1 h t m l _ d o c

    = " " " < h t m l > < h e a d > < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > < / h e a d > < b o d y > < p c l a s s = " t i t l e " > < b > T h e D o r m o u s e ' s s t o r y < / b > < / p > < p c l a s s = " s t o r y " > O n c e u p o n a t i m e t h e r e w e r e t h r e e l i t t l e s i s t e r s ; a n d t h e i r n a m e s w e r e < a h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " c l a s s = " s i s t e r " i d = " l i n k 1 " > E l s i e < / a > , < a h r e f = " h t t p : / / e x a m p l e . c o m / l a c i e " c l a s s = " s i s t e r " i d = " l i n k 2 " > L a c i e < / a > a n d < a h r e f = " h t t p : / / e x a m p l e . c o m / t i l l i e " c l a s s = " s i s t e r " i d = " l i n k 3 " > T i l l i e < / a > ; a n d t h e y l i v e d a t t h e b o t t o m o f a w e l l . < / p > < p c l a s s = " s t o r y " > . . . < / p > " " " f r o m b s 4 i m p o r t B e a u t i f u l S o u p s o u p = B e a u t i f u l S o u p ( h t m l _ d o c , ' h t m l . p a r s e r ' ) p r i n t ( s o u p . p r e t t i f y ( ) ) < h t m l > < h e a d > < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > < / h e a d > < b o d y > < p c l a s s = " t i t l e " > < b > T h e D o r m o u s e ' s s t o r y < / b > < / p > < p c l a s s = " s t o r y " > O n c e u p o n a t i m e t h e r e w e r e t h r e e l i t t l e s i s t e r s ; a n d t h e i r < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " i d = " l i n k 1 < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / l a c i e " i d = " l i n k 2 < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / t i l l i e " i d = " l i n k a n d t h e y l i v e d a t t h e b o t t o m o f a w e l l . < / p > < p c l a s s = " s t o r y " > . . . < / p > < / b o d y > < / h t m l > 4 / 20
  2. Example #2 f o r l i n k i

    n s o u p . f i n d _ a l l ( ' a ' ) : p r i n t ( l i n k . g e t ( ' h r e f ' ) ) p r i n t ( s o u p . g e t _ t e x t ( ) ) p r i n t s o u p . t i t l e # < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > p r i n t s o u p . t i t l e . n a m e # u ' t i t l e ' p r i n t s o u p . t i t l e . s t r i n g # u ' T h e D o r m o u s e ' s s t o r y ' p r i n t s o u p . t i t l e . p a r e n t . n a m e # u ' h e a d ' p r i n t s o u p . p # < p c l a s s = " t i t l e " > < b > T h e D o r m o u s e ' s s t o r y < / b > < / p > p r i n t s o u p . p [ ' c l a s s ' ] # u ' t i t l e ' p r i n t s o u p . a # < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " i d = " l i n k 1 " > E l s i e < / a > p r i n t s o u p . f i n d ( i d = " l i n k 3 " ) # < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / t i l l i e " i d = " l i n k 3 " > T i l l i e < / a > p r i n t s o u p . f i n d _ a l l ( ' a ' ) # [ < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " i d = " l i n k 1 " > E l s i e < / a > , # < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / l a c i e " i d = " l i n k 2 " > L a c i e < / a > , # < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / t i l l i e " i d = " l i n k 3 " > T i l l i e < / a > ] < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > t i t l e T h e D o r m o u s e ' s s t o r y h e a d < p c l a s s = " t i t l e " > < b > T h e D o r m o u s e ' s s t o r y < / b > < / p > [ u ' t i t l e ' ] < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " i d = " l i n k 1 " < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / t i l l i e " i d = " l i n k 3 " [ < a c l a s s = " s i s t e r " h r e f = " h t t p : / / e x a m p l e . c o m / e l s i e " i d = " l i n k 1 " h t t p : / / e x a m p l e . c o m / e l s i e h t t p : / / e x a m p l e . c o m / l a c i e h t t p : / / e x a m p l e . c o m / t i l l i e T h e D o r m o u s e ' s s t o r y T h e D o r m o u s e ' s s t o r y O n c e u p o n a t i m e t h e r e w e r e t h r e e l i t t l e s i s t e r s ; a n d t h e i r n a E l s i e , L a c i e a n d T i l l i e ; a n d t h e y l i v e d a t t h e b o t t o m o f a w e l l . . . . 5 / 20
  3. Example #3 h e a d _ t a g

    = s o u p . h e a d p r i n t h e a d _ t a g # < h e a d > < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > < / h e a d > p r i n t h e a d _ t a g . c o n t e n t s # [ < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > ] p r i n t h e a d _ t a g . s t r i n g # u ' T h e D o r m o u s e ' s s t o r y ' f o r c h i l d i n h e a d _ t a g . d e s c e n d a n t s : # < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > p r i n t ( c h i l d ) # T h e D o r m o u s e ' s s t o r y # - - - - - - - t i t l e _ t a g = h e a d _ t a g . c o n t e n t s [ 0 ] p r i n t t i t l e _ t a g # < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > p r i n t t i t l e _ t a g . c o n t e n t s # [ u ' T h e D o r m o u s e ' s s t o r y ' ] p r i n t t i t l e _ t a g . s t r i n g # u ' T h e D o r m o u s e ' s s t o r y ' t e x t = t i t l e _ t a g . c o n t e n t s [ 0 ] # p r i n t t e x t . c o n t e n t s # A t t r i b u t e E r r o r : ' N a v i g a b l e S t r i n g ' o b j e c t h a s n o a t t r i b u t e ' c o n t e n t s ' f o r c h i l d i n t i t l e _ t a g . c h i l d r e n : p r i n t ( c h i l d ) # T h e D o r m o u s e ' s s t o r y < h e a d > < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > < / h e a d > [ < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > ] T h e D o r m o u s e ' s s t o r y < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > T h e D o r m o u s e ' s s t o r y # - - - - - - - < t i t l e > T h e D o r m o u s e ' s s t o r y < / t i t l e > [ u " T h e D o r m o u s e ' s s t o r y " ] T h e D o r m o u s e ' s s t o r y T h e D o r m o u s e ' s s t o r y 6 / 20
  4. Example #4 # p r i n t s o

    u p . c o n t e n t s p r i n t l e n ( s o u p . c o n t e n t s ) # 1 p r i n t s o u p . c o n t e n t s [ 0 ] . n a m e # u ' h t m l ' p r i n t l e n ( l i s t ( s o u p . c h i l d r e n ) ) # 1 p r i n t l e n ( l i s t ( s o u p . d e s c e n d a n t s ) ) # 2 5 # - - - - - - - - p r i n t ( s o u p . h t m l . s t r i n g ) # N o n e # f o r s t r i n g i n s o u p . s t r i n g s : # p r i n t ( r e p r ( s t r i n g ) ) f o r s t r i n g i n s o u p . s t r i p p e d _ s t r i n g s : p r i n t ( r e p r ( s t r i n g ) ) 1 h t m l 1 2 5 N o n e # - - - - - - - - u " T h e D o r m o u s e ' s s t o r y " u " T h e D o r m o u s e ' s s t o r y " u ' O n c e u p o n a t i m e t h e r e w e r e t h r e e l i t t l e s i s t e r s ; a n d t h e i r u ' E l s i e ' u ' , ' u ' L a c i e ' u ' a n d ' u ' T i l l i e ' u ' ; \ n a n d t h e y l i v e d a t t h e b o t t o m o f a w e l l . ' u ' . . . ' 7 / 20
  5. Example #5 s o u p = B e a

    u t i f u l S o u p ( ' < b c l a s s = " b o l d e s t " > E x t r e m e l y b o l d < / b > ' t a g = s o u p . b p r i n t t y p e ( t a g ) p r i n t t a g . n a m e # u ' b ' t a g . n a m e = " b l o c k q u o t e " p r i n t t a g # < b l o c k q u o t e c l a s s = " b o l d e s t " > E x t r e m e l y b o l d < / b l o c k q u o t e > p r i n t t a g [ ' c l a s s ' ] # u ' b o l d e s t ' p r i n t t a g . a t t r s # { u ' c l a s s ' : u ' b o l d e s t ' } t a g [ ' c l a s s ' ] = ' v e r y b o l d ' t a g [ ' i d ' ] = 1 p r i n t t a g # < b l o c k q u o t e c l a s s = " v e r y b o l d " i d = " 1 " > E x t r e m e l y b o l d < / b l o c k q u o t e > # - - - - - - - - - - - - - d e l t a g [ ' c l a s s ' ] d e l t a g [ ' i d ' ] p r i n t t a g # < b l o c k q u o t e > E x t r e m e l y b o l d < / b l o c k q u o t e > # p r i n t t a g [ ' c l a s s ' ] # K e y E r r o r : ' c l a s s ' p r i n t ( t a g . g e t ( ' c l a s s ' ) ) # N o n e < c l a s s ' b s 4 . e l e m e n t . T a g ' > b < b l o c k q u o t e c l a s s = " b o l d e s t " > E x t r e m e l y b o l d < / b l o c k q u o t e > [ ' b o l d e s t ' ] { ' c l a s s ' : [ ' b o l d e s t ' ] } < b l o c k q u o t e c l a s s = " v e r y b o l d " i d = " 1 " > E x t r e m e l y b o l d < / b l o c k q u o t e # - - - - - - - - - - - - - < b l o c k q u o t e > E x t r e m e l y b o l d < / b l o c k q u o t e > N o n e 8 / 20
  6. Example #6 c l a s s _ s o

    u p = B e a u t i f u l S o u p ( ' < p c l a s s = " b o d y s t r i k e o u t " > < / p > ' p r i n t c l a s s _ s o u p . p [ ' c l a s s ' ] # [ " b o d y " , " s t r i k e o u t " ] c l a s s _ s o u p = B e a u t i f u l S o u p ( ' < p c l a s s = " b o d y " > < / p > ' ) p r i n t c l a s s _ s o u p . p [ ' c l a s s ' ] # [ " b o d y " ] i d _ s o u p = B e a u t i f u l S o u p ( ' < p i d = " m y i d " > < / p > ' ) p r i n t i d _ s o u p . p [ ' i d ' ] # ' m y i d ' # - - - - - - - - - - r e l _ s o u p = B e a u t i f u l S o u p ( ' < p > B a c k t o t h e < a r e l = " i n d e x " > h o m e p a g e < / a > < / p > ' p r i n t r e l _ s o u p . a [ ' r e l ' ] # [ ' i n d e x ' ] r e l _ s o u p . a [ ' r e l ' ] = [ ' i n d e x ' , ' c o n t e n t s ' ] p r i n t ( r e l _ s o u p . p ) # < p > B a c k t o t h e < a r e l = " i n d e x c o n t e n t s " > h o m e p a g e < / a > < / p > # - - - - - - - - - - x m l _ s o u p = B e a u t i f u l S o u p ( ' < p c l a s s = " b o d y s t r i k e o u t " > < / p > ' , p r i n t x m l _ s o u p . p [ ' c l a s s ' ] # u ' b o d y s t r i k e o u t ' [ ' b o d y ' , ' s t r i k e o u t ' ] [ ' b o d y ' ] m y i d # - - - - - - - - - - [ ' i n d e x ' ] < p > B a c k t o t h e < a r e l = " i n d e x c o n t e n t s " > h o m e p a g e < / a > < / p > # - - - - - - - - - - b o d y s t r i k e o u t When you turn a tag back into a string, multiple attribute values are consolidated. If you parse a document as XML, there are no multi- valued attributes. The r e l attribute specifies the relationship between the current document and the linked document (Only used if the h r e f attribute is present). 9 / 20
  7. Test #1 i m p o r t r e

    q u e s t s i m p o r t b s 4 r e s p o n s e = r e q u e s t s . g e t ( ' h t t p : / / p y v i d e o . o r g / c a t e g o r y / 5 0 / p y c o n - u s - 2 0 1 4 ' s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) # a t a g s = s o u p . s e l e c t ( ' d i v # v i d e o - s u m m a r y - c o n t e n t a [ h r e f ^ = / v i d e o ] ' ) l i n k s = [ a . a t t r s . g e t ( ' h r e f ' ) f o r a i n s o u p . s e l e c t ( ' d i v # v i d e o - s u m m a r y - c o n t e n t a [ h r e f ^ = / v i d e o ] ' p r i n t l i n k s [ 1 : 5 ] [ ' / v i d e o / 2 6 7 6 / 2 d 3 d - g r a p h i c s - w i t h - p y t h o n - o n - m o b i l e - p l a t f o r m s ' l i n k s = [ a . a t t r s . g e t ( ' h r e f ' ) f o r a i n s o u p . s e l e c t ( ' d i v # v i d e o - s u m m a r y - c o n t e n t s t r o n g a [ h r e f ^ = / v i d e o ] ' pycon-scraper.py #1 i m p o r t b s 4 i m p o r t r e i m p o r t r e q u e s t s i m p o r t a r g p a r s e f r o m m u l t i p r o c e s s i n g . p o o l i m p o r t T h r e a d P o o l a s P o o l r o o t _ u r l = ' h t t p : / / p y v i d e o . o r g ' i n d e x _ u r l = r o o t _ u r l + ' / c a t e g o r y / 5 0 / p y c o n - u s - 2 0 1 4 ' d e f g e t _ v i d e o _ p a g e _ u r l s ( ) : r e s p o n s e = r e q u e s t s . g e t ( i n d e x _ u r l ) s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) a l l v i d s = [ a . a t t r s . g e t ( ' h r e f ' ) f o r a i n s o u p . s e l e c t ( ' d i v # v r e t u r n a l l v i d s [ 0 : 1 0 ] 14 / 20
  8. Test #2 r o o t _ u r l

    = ' h t t p : / / p y v i d e o . o r g ' v i d e o _ p a g e _ u r l = ' / v i d e o / 2 6 6 8 / w r i t i n g - r e s t f u l - w e b - s e r v i c e s - w i t h - f l a s k ' v i d e o _ d a t a = { } r e s p o n s e = r e q u e s t s . g e t ( r o o t _ u r l + v i d e o _ p a g e _ u r l ) s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) v i d e o _ d a t a [ ' t i t l e ' ] = s o u p . s e l e c t ( ' d i v # v i d e o b o x h 3 ' ) [ 0 ] . g e t _ t e x t ( ) v i d e o _ d a t a [ ' s p e a k e r s ' ] = [ a . g e t _ t e x t ( ) f o r a i n s o u p . s e l e c t ( v i d e o _ d a t a [ ' y o u t u b e _ u r l ' ] = s o u p . s e l e c t ( ' d i v # s i d e b a r a [ h r e f ^ = h t t p : / / w w w . y o u t u b e . c o m ] ' p r i n t v i d e o _ d a t a { ' s p e a k e r s ' : [ u ' M i g u e l G r i n b e r g ' ] , ' y o u t u b e _ u r l ' : u ' h t t p : / / w w w . y o u t u b e . c o m / w a t c h ? v = p x _ v g 9 F a r 1 Y ' pycon-scraper.py #2 d e f g e t _ v i d e o _ d a t a ( v i d e o _ p a g e _ u r l ) : v i d e o _ d a t a = { } r e s p o n s e = r e q u e s t s . g e t ( r o o t _ u r l + v i d e o _ p a g e _ u r l ) s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) v i d e o _ d a t a [ ' t i t l e ' ] = s o u p . s e l e c t ( ' d i v # v i d e o b o x h 3 ' ) [ 0 ] . g e v i d e o _ d a t a [ ' s p e a k e r s ' ] = [ a . g e t _ t e x t ( ) f o r a i n s o u p . s e l e c v i d e o _ d a t a [ ' y o u t u b e _ u r l ' ] = s o u p . s e l e c t ( ' d i v # s i d e b a r a [ h r e # . . . r e t u r n v i d e o _ d a t a 15 / 20
  9. Test #3 i m p o r t r e

    q u e s t s i m p o r t b s 4 i m p o r t r e r e s p o n s e = r e q u e s t s . g e t ( ' h t t p s : / / w w w . y o u t u b e . c o m / w a t c h ? v = p x _ v g 9 F a r 1 Y ' s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) v i d e o _ d a t a [ ' v i e w s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . s e l e c t ( ' . w a t c h - v i e w - c o u n t ' v i d e o _ d a t a [ ' l i k e s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . s e l e c t ( ' . l i k e - b u t t o n - r e n d e r e r - l i k e - b u t t o n s p a n . y t - u i x - b u t t o n - c o n t e n t ' v i d e o _ d a t a [ ' d i s l i k e s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . s e l e c t ( p r i n t v i d e o _ d a t a { ' s p e a k e r s ' : [ u ' M i g u e l G r i n b e r g ' ] , ' v i e w s ' : 1 1 9 0 8 , ' t i t l e ' : pycon-scraper.py #3 d e f g e t _ v i d e o _ d a t a ( v i d e o _ p a g e _ u r l ) : # . . . # i n i t i a l i z e c o u n t e r s v i d e o _ d a t a [ ' v i e w s ' ] = 0 v i d e o _ d a t a [ ' l i k e s ' ] = 0 v i d e o _ d a t a [ ' d i s l i k e s ' ] = 0 t r y : r e s p o n s e = r e q u e s t s . g e t ( v i d e o _ d a t a [ ' y o u t u b e _ u r l ' ] , h e a s o u p = b s 4 . B e a u t i f u l S o u p ( r e s p o n s e . t e x t ) v i d e o _ d a t a [ ' v i e w s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . s e v i d e o _ d a t a [ ' l i k e s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . s e l v i d e o _ d a t a [ ' d i s l i k e s ' ] = i n t ( r e . s u b ( ' [ ^ 0 - 9 ] ' , ' ' , s o u p . e x c e p t : # s o m e o r a l l o f t h e c o u n t e r s c o u l d n o t b e s c r a p e d p a s s r e t u r n v i d e o _ d a t a 16 / 20
  10. pycon-scraper.py #4 Notes d e f s h o w

    _ v i d e o _ s t a t s ( o p t i o n s ) : p o o l = P o o l ( 8 ) v i d e o _ p a g e _ u r l s = g e t _ v i d e o _ p a g e _ u r l s ( ) r e s u l t s = p o o l . m a p ( g e t _ v i d e o _ d a t a , v i d e o _ p a g e _ u r l s ) # - - - - - f u n c ( v i d e o ) : r e t u r n v i d e o [ o p t i o n s . s o r t ] d e f p a r s e _ a r g s ( ) : p a r s e r = a r g p a r s e . A r g u m e n t P a r s e r ( d e s c r i p t i o n = ' S h o w P y C o n 2 0 1 4 v i d e o s t a t i s t i c s . ' p a r s e r . a d d _ a r g u m e n t ( ' - - s o r t ' , m e t a v a r = ' F I E L D ' , c h o i c e s = [ p a r s e r . a d d _ a r g u m e n t ( ' - - m a x ' , m e t a v a r = ' M A X ' , t y p e = i n t , h e l p = p a r s e r . a d d _ a r g u m e n t ( ' - - c s v ' , a c t i o n = ' s t o r e _ t r u e ' , d e f a u l t = p a r s e r . a d d _ a r g u m e n t ( ' - - w o r k e r s ' , t y p e = i n t , d e f a u l t = 8 , h e l p = r e t u r n p a r s e r . p a r s e _ a r g s ( ) # e x : p y t h o n p y c o n - s c r a p e r . p y - - s o r t v i e w s - - m a x 2 5 - - w o r k e r s 8 d e f s h o w _ v i d e o _ s t a t s ( o p t i o n s ) : p o o l = P o o l ( o p t i o n s . w o r k e r s ) v i d e o _ p a g e _ u r l s = g e t _ v i d e o _ p a g e _ u r l s ( ) r e s u l t s = s o r t e d ( p o o l . m a p ( g e t _ v i d e o _ d a t a , v i d e o _ p a g e _ u r l s ) p r i n t l e n ( r e s u l t s ) m a x = o p t i o n s . m a x i f m a x i s N o n e o r m a x > l e n ( r e s u l t s ) : m a x = l e n ( r e s u l t s ) i f o p t i o n s . c s v : p r i n t ( u ' " t i t l e " , " s p e a k e r s " , " v i e w s " , " l i k e s " , " d i s l i k e s " e l s e : p r i n t ( u ' V i e w s + 1 - 1 T i t l e ( S p e a k e r s ) ' ) f o r i i n r a n g e ( m a x ) : i f o p t i o n s . c s v : p r i n t ( u ' " { 0 } " , " { 1 } " , { 2 } , { 3 } , { 4 } ' . f o r m a t ( r e s u l t s [ i ] e l s e : p r i n t ( u ' { 0 : 5 d } { 1 : 3 d } { 2 : 3 d } { 3 } ( { 4 } ) ' . f o r m a t ( r e s i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : s h o w _ v i d e o _ s t a t s ( p a r s e _ a r g s ( ) ) 17 / 20
  11. $> python pycon-scraper.py --sort views V i e w s

    + 1 - 1 T i t l e ( S p e a k e r s ) 8 6 0 8 8 0 1 0 A n a l y z i n g R a p L y r i c s w i t h P y t h o n ( J u l i e L a v o i e ) 7 3 0 2 2 8 1 B u i l d i n g t h e A p p ( M i k e B a y e r ) 4 6 0 3 2 5 3 2 D / 3 D g r a p h i c s w i t h P y t h o n o n m o b i l e p l a t f o r m s ( N i k o S k r y p n i k ) 4 0 5 6 3 0 0 D e s i g n i n g D j a n g o ' s M i g r a t i o n s ( A n d r e w G o d w i n ) 3 9 2 3 4 1 0 C h e a p H e l i c o p t e r s I n M y L i v i n g R o o m ( N e d J a c k s o n L o v e l y ) 3 4 0 7 3 6 2 A S c e n i c D r i v e t h r o u g h t h e D j a n g o R e q u e s t - R e s p o n s e C y c l e ( D a n L a n g e r ) 3 3 4 3 3 3 0 A d v a n c e d t e c h n i q u e s f o r W e b f u n c t i o n a l t e s t i n g ( J u l i e n P h a l i p ) 1 5 9 8 2 8 0 D a t a i n t e n s i v e b i o l o g y i n t h e c l o u d : i n s t r u m e n t i n g A L L t h e t h i n g s ( C . T i t u s B r o w n ) 9 4 1 8 0 D e l i v e r Y o u r S o f t w a r e I n A n E n v e l o p e ( A u g i e F a c k l e r , N a t h a n i e l M a n i s t a ) 7 5 1 1 0 C l o s i n g a d d r e s s - P y C o n 2 0 1 4 ( 2 0 1 4 / 0 4 / 1 3 ) ( ) 18 / 20
  12. References 1. Beautiful Soup Documentation 2. Easy Web Scraping with

    Python 3. Generate statistics about PyCon 2014 videos 19 / 20