libcraigscrape 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ <h2><%=h @subject %></h2>
2
+
3
+ <%@summaries.each do |summary| %>
4
+ <h3><%=h summary[:search].name%></h3>
5
+ <%summary[:postings].each do |post|%>
6
+ <%='<p>%s <a href="%s">%s -</a>%s%s</p>' % [
7
+ h(post.date.strftime('%b %d')),
8
+ post.full_url,
9
+ h(post.label),
10
+ (post.location) ? '<font size="-1"> (%s)</font>' % h(post.location) : '',
11
+ (post.has_pic_or_img?) ? ' <span style="color: orange"> img</span>': ''
12
+ ] -%>
13
+ <% end %>
14
+ <% end %>
@@ -0,0 +1,15 @@
1
+ CRAIGSLIST REPORTER
2
+
3
+ <%@summaries.each do |summary| -%>
4
+ <%=summary[:search].name %>
5
+ <% summary[:postings].collect do |post| -%>
6
+ <%='%s : %s %s %s %s' % [
7
+ post.date.strftime('%b %d'),
8
+ post.label,
9
+ (post.location) ? " (#{post.location})" : '',
10
+ (post.has_pic_or_img?) ? ' [img]': '',
11
+ post.full_url
12
+ ] -%>
13
+
14
+ <% end %>
15
+ <% end -%>
@@ -0,0 +1,352 @@
1
+ # = About libcraigscrape.rb
2
+ #
3
+ # All of libcraigscrape's objects and methods are loaded when you use <tt>require 'libcraigscrape'</tt> in your code.
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'hpricot'
8
+ require 'net/http'
9
+ require 'htmlentities'
10
+ require 'activesupport'
11
+
12
+ # A base class encapsulating the libcraigscrape objests, and providing some utility methods.
13
+ class CraigScrape
14
+ cattr_accessor :logger
15
+ cattr_accessor :time_now
16
+
17
+ def self.most_recently_expired_time(month, day) #:nodoc:
18
+ now = (time_now) ? time_now : Time.now
19
+
20
+ # This ensures we always generate a time in the past, by guessing the year and subtracting one if we guessed wrong
21
+ ret = Time.local now.year, month, day
22
+ ret = Time.local now.year-1, month, day if ret > now
23
+
24
+ ret
25
+ end
26
+
27
+ module ParseObjectHelper #:nodoc:
28
+ def he_decode(text)
29
+ HTMLEntities.new.decode text
30
+ end
31
+ end
32
+
33
+ # PostFull represents a fully downloaded, and parsed, Craigslist post.
34
+ # This class is generally returned by the listing scrape methods, and
35
+ # contains the post summaries for a specific search url, or a general listing category
36
+ class PostFull
37
+ include ParseObjectHelper
38
+
39
+ # String, represents the post's reply-to address, if listed
40
+ attr_reader :reply_to
41
+
42
+ # Time, reflects the full timestamp of the posting
43
+ attr_reader :post_time
44
+
45
+ # String, The contents of the item's html body heading
46
+ attr_reader :header
47
+
48
+ # String, the item's title
49
+ attr_reader :title
50
+
51
+ # Integer, Craigslist's unique posting id
52
+ attr_reader :posting_id
53
+
54
+ # String, The full-html contents of the post
55
+ attr_reader :contents
56
+
57
+ # String, the location of the item, as best could be parsed
58
+ attr_reader :location
59
+
60
+ # Array, hierarchial representation of the posts section
61
+ attr_reader :full_section
62
+
63
+ # Array, urls of the post's craigslist-hosted images
64
+ attr_reader :images
65
+
66
+ POST_DATE = /Date:[^\d]*((?:[\d]{2}|[\d]{4})\-[\d]{1,2}\-[\d]{1,2}[^\d]+[\d]{1,2}\:[\d]{1,2}[ ]*[AP]M[^a-z]+[a-z]+)/i
67
+ LOCATION = /Location\:[ ]+(.+)/
68
+ POSTING_ID = /PostingID\:[ ]+([\d]+)/
69
+ REPLY_TO = /(.+)/
70
+ PRICE = /\$([\d]+(?:\.[\d]{2})?)/
71
+
72
+ def initialize(page) #:nodoc:
73
+ # We proceed from easy to difficult:
74
+
75
+ @images = []
76
+
77
+ @header = he_decode page.at('h2').inner_html if page.at('h2')
78
+ @title = he_decode page.at('title').inner_html if page.at('title')
79
+ @title = nil if @title.length ==0
80
+
81
+ @full_section = []
82
+ (page/"div[@class='bchead']//a").each do |a|
83
+ @full_section << he_decode(a.inner_html) unless a['id'] and a['id'] == 'ef'
84
+ end
85
+
86
+ # Reply To:
87
+ cursor = page.at 'hr'
88
+ cursor = cursor.next_sibling until cursor.nil? or cursor.name == 'a'
89
+ @reply_to = $1 if cursor and REPLY_TO.match he_decode(cursor.inner_html)
90
+
91
+ # Post Date:
92
+ cursor = page.at 'hr'
93
+ cursor = cursor.next_node until cursor.nil? or POST_DATE.match cursor.to_s
94
+ @post_time = Time.parse $1 if $1
95
+
96
+ # Posting ID:
97
+ cursor = (page/"#userbody").first
98
+ cursor = cursor.next_node until cursor.nil? or POSTING_ID.match cursor.to_s
99
+ @posting_id = $1.to_i if $1
100
+
101
+ # OK - so the biggest problem parsing the contents of a craigslist post is that users post invalid html all over the place
102
+ # THis bad html trips up hpricot, and I've resoorted to splitting the page up using string parsing.
103
+ userbody_as_s,craigbody_as_s = $1, $2 if /\<div id\=\"userbody\">(.+)\<br[ ]*[\/]?\>\<br[ ]*[\/]?\>(.+)\<\/div\>/m.match page.to_s
104
+
105
+ # Contents:
106
+ @contents = he_decode(userbody_as_s.strip) if userbody_as_s
107
+
108
+ # I made this a separate method since we're not actually parsing everything in here as-is.
109
+ # This will make it easier for the next guy to work with if wants to parse out the information we're disgarding...
110
+ parse_craig_body Hpricot.parse(craigbody_as_s) if craigbody_as_s
111
+ end
112
+
113
+ def parse_craig_body(craigbody_els) #:nodoc:
114
+ # Location (when explicitly defined):
115
+ cursor = craigbody_els.at('ul')
116
+ cursor = cursor.at('li') if cursor
117
+ @location = he_decode($1) if cursor and LOCATION.match(cursor.inner_html)
118
+
119
+ # Real estate listings can work a little different for location:
120
+ unless @location
121
+ cursor = craigbody_els.at('small')
122
+ cursor = cursor.previous_node until cursor.nil? or cursor.text?
123
+
124
+ @location = he_decode(cursor.to_s.strip) if cursor
125
+ end
126
+
127
+ # Now let's find the craigslist hosted images:
128
+ img_table = (craigbody_els / 'table').find{|e| e.name == 'table' and e[:summary] == 'craigslist hosted images'}
129
+
130
+ @images = (img_table / 'img').collect{|i| i[:src]} if img_table
131
+ end
132
+
133
+ # Returns the price (as float) of the item, as best ascertained by the post header
134
+ def price
135
+ $1.to_f if @title and @header and PRICE.match(@header.gsub(/#{@title}/, ''))
136
+ end
137
+
138
+ # Returns the post contents with all html tags removed
139
+ def contents_as_plain
140
+ @contents.gsub(/<\/?[^>]*>/, "") if @contents
141
+ end
142
+ end
143
+
144
+ # Listings represents a parsed Craigslist listing page and is generally returned by CraigScrape.scrape_listing
145
+ class Listings
146
+ include ParseObjectHelper
147
+
148
+ # Array, PostSummary objects found in the listing
149
+ attr_reader :posts
150
+
151
+ # String, URL Path of the next page link
152
+ attr_reader :next_page_href
153
+
154
+ def initialize(page, base_url = nil) #:nodoc:
155
+ current_date = nil
156
+ @posts = []
157
+
158
+ tags_worth_parsing = page.get_elements_by_tag_name('p','h4')
159
+
160
+ # This will find the link on 'general listing' pages, if there is one:
161
+ last_twp_a = tags_worth_parsing.last.at('a') if tags_worth_parsing.last
162
+ next_link = tags_worth_parsing.pop.at('a') if last_twp_a and /^[ ]*next [\d]+ postings[ ]*$/.match last_twp_a.inner_html
163
+
164
+ # Now we iterate though the listings:
165
+ tags_worth_parsing.each do |el|
166
+ case el.name
167
+ when 'p'
168
+ @posts << CraigScrape::PostSummary.new(el, current_date, base_url)
169
+ when 'h4'
170
+ current_date = CraigScrape.most_recently_expired_time $1, $2 if /^[ ]*[^ ]+[ ]+([^ ]+)[ ]+([^ ]+)[ ]*$/.match he_decode(el.inner_html)
171
+ end
172
+ end
173
+
174
+ next_link = (page / 'a').find{ |a| he_decode(a.inner_html) == '<b>Next>></b>' } unless next_link
175
+
176
+ # This will find the link on 'search listing' pages (if there is one):
177
+ @next_page_href = next_link[:href] if next_link
178
+ end
179
+
180
+ end
181
+
182
+ # PostSummary represents a parsed summary posting, typically found on a Listing page.
183
+ # This object is returned by the CraigScrape.scrape_listing methods
184
+ class PostSummary
185
+ include ParseObjectHelper
186
+
187
+ # Time, date of post, as a Time object. Does not include hours/minutes
188
+ attr_reader :date
189
+
190
+ # String, The label of the post
191
+ attr_reader :label
192
+
193
+ # String, The path fragment of the post's URI
194
+ attr_reader :href
195
+
196
+ # String, The location of the post
197
+ attr_reader :location
198
+
199
+ # String, The abbreviated section of the post
200
+ attr_reader :section
201
+
202
+ # Array, which image types are listed for the post
203
+ attr_reader :img_types
204
+
205
+ PRICE = /((?:^\$[\d]+(?:\.[\d]{2})?)|(?:\$[\d]+(?:\.[\d]{2})?$))/
206
+ DATE = /^[ ]([^ ]+)[ ]+([^ ]+)[ ]*[\-][ ]*$/
207
+ LABEL = /^(.+?)[ ]*\-$/
208
+ LOCATION = /^[ ]*\((.*?)\)$/
209
+ IMG_TYPE = /^[ ]*(.+)[ ]*$/
210
+
211
+ def initialize(p_element, date = nil, base_url = nil) #:nodoc:
212
+ title_anchor, section_anchor = p_element.search 'a'
213
+ location_tag = p_element.at 'font'
214
+ has_pic_tag = p_element.at 'span'
215
+
216
+ @location = he_decode p_element.at('font').inner_html if location_tag
217
+ @location = $1 if LOCATION.match @location
218
+
219
+ @img_types = []
220
+ if has_pic_tag
221
+ img_type = he_decode has_pic_tag.inner_html
222
+ img_type = $1.tr('^a-zA-Z0-9',' ') if IMG_TYPE.match img_type
223
+
224
+ @img_types = img_type.split(' ').collect{|t| t.to_sym}
225
+ end
226
+
227
+ @section = he_decode section_anchor.inner_html if section_anchor
228
+
229
+ @date = date
230
+ if DATE.match he_decode(p_element.children[0])
231
+ @date = CraigScrape.most_recently_expired_time $1, $2.to_i
232
+ end
233
+
234
+ @label = he_decode title_anchor.inner_html
235
+ @label = $1 if LABEL.match @label
236
+
237
+ @href = title_anchor[:href]
238
+ @base_url = base_url
239
+ end
240
+
241
+ # Returns the full uri including host and scheme, not just the href
242
+ def full_url
243
+ '%s%s' % [@base_url, @href]
244
+ end
245
+
246
+ # true if post summary has the img label
247
+ def has_img?
248
+ img_types.include? :img
249
+ end
250
+
251
+ # true if post summary has the pic label
252
+ def has_pic?
253
+ img_types.include? :pic
254
+ end
255
+
256
+ # true if post summary has either the img or pic label
257
+ def has_pic_or_img?
258
+ img_types.length > 0
259
+ end
260
+
261
+ # Returns the best-guess of a price, judging by the label's contents.
262
+ def price
263
+ $1.tr('$','').to_f if @label and PRICE.match(@label)
264
+ end
265
+
266
+ # Requests and returns the PostFull object that corresponds with this summary's full_url
267
+ def full_post
268
+ @full_post = CraigScrape.scrape_full_post(full_url) if @full_post.nil? and full_url
269
+
270
+ @full_post
271
+ end
272
+ end
273
+
274
+ # Scrapes a single listing url and returns a Listings object representing the contents
275
+ def self.scrape_listing(listing_url)
276
+ current_uri = ( listing_url.class == String ) ? URI.parse(listing_url) : listing_url
277
+
278
+ CraigScrape::Listings.new Hpricot.parse(self.fetch_url(current_uri)), '%s://%s' % [current_uri.scheme, current_uri.host]
279
+ end
280
+
281
+ # Continually scrapes listings, using the supplied url as a starting point, until the supplied block returns true or
282
+ # until there's no more 'next page' links available to click on
283
+ def self.scrape_until(listing_url, &post_condition)
284
+ ret = []
285
+
286
+ current_uri = URI.parse listing_url
287
+ catch "ScrapeBreak" do
288
+ while current_uri do
289
+ listings = scrape_listing current_uri
290
+
291
+ listings.posts.each do |post|
292
+ throw "ScrapeBreak" if post_condition.call(post)
293
+ ret << post
294
+ end
295
+
296
+ current_uri = (listings.next_page_href) ? self.uri_from_href( current_uri, listings.next_page_href ) : nil
297
+ end
298
+ end
299
+
300
+ ret
301
+ end
302
+
303
+ # Scrapes a single Post Url, and returns a PostFull object representing its contents.
304
+ def self.scrape_full_post(post_url)
305
+ CraigScrape::PostFull.new Hpricot.parse(self.fetch_url(post_url))
306
+ end
307
+
308
+ # Continually scrapes listings, using the supplied url as a starting point, until 'count' summaries have been retrieved
309
+ # or no more 'next page' links are avialable to be clicked on. Returns an array of PostSummary objects.
310
+ def self.scrape_posts(listing_url, count)
311
+ count_so_far = 0
312
+ self.scrape_until(listing_url) {|post| count_so_far+=1; count < count_so_far }
313
+ end
314
+
315
+ # Continually scrapes listings, until the date newer_then has been reached, or no more 'next page' links are avialable to be clicked on.
316
+ # Returns an array of PostSummary objects. Dates are based on the Month/Day 'datestamps' reported in the listing summaries.
317
+ # As such, time-based cutoffs are not supported here. The scrape_until method, utilizing the SummaryPost.full_post method could achieve
318
+ # time-based cutoffs, at the expense of retrieving every post in full during enumerations.
319
+ #
320
+ # <b>Note:<b> The results will not include post summaries having the newer_then date themselves.
321
+ def self.scrape_posts_since(listing_url, newer_then)
322
+ self.scrape_until(listing_url) {|post| post.date <= newer_then}
323
+ end
324
+
325
+ def self.fetch_url(uri) #:nodoc:
326
+ # This handles the redirects for us
327
+ uri_dest = ( uri.class == String ) ? URI.parse(uri) : uri
328
+
329
+ logger.info "Requesting: %s" % uri_dest.to_s unless logger.nil?
330
+
331
+ resp, data = Net::HTTP.new( uri_dest.host, uri_dest.port).get uri_dest.request_uri, nil
332
+
333
+ redirect_to = resp.response['Location'] if resp.response['Location']
334
+ redirect_to = $1 if /<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0;[ ]*URL=(.*)\">/i.match data
335
+
336
+ (redirect_to) ? self.fetch_url(redirect_to) : data
337
+ end
338
+
339
+ def self.uri_from_href(base_uri, href) #:nodoc:
340
+ URI.parse(
341
+ case href
342
+ when /^http[s]?\:\/\// : href
343
+ when /^\// : "%s://%s%s" % [ base_uri.scheme, base_uri.host, href ]
344
+ else "%s://%s%s" % [
345
+ base_uri.scheme, base_uri.host,
346
+ /^(.*?\/)[^\/]+$/.match(base_uri.path) ? $1+href : base_uri.path+href
347
+ ]
348
+ end
349
+ )
350
+ end
351
+
352
+ end
data/test/google.html ADDED
@@ -0,0 +1,8 @@
1
+ <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>window.google={kEI:"zuvtSYzvA5-QeZOZsRc",kEXPI:"17259,20257",kHL:"en"};
2
+ window.google.sn="webhp";window.google.timers={load:{t:{start:(new Date).getTime()}}};try{window.google.pt=window.gtbExternal&&window.gtbExternal.pageT()||window.external&&window.external.pageT}catch(b){}
3
+ window.google.jsrt_kill=1;
4
+ var _gjwl=location;function _gjuc(){var a=_gjwl.hash;if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var e=a.substring(d,b);if(e.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(e=="cad=h")return 0;c=b}_gjwl.href="search?"+a+"&cad=h";return 1}}return 0}function _gjp(){!(window._gjwl.hash&&window._gjuc())&&setTimeout(_gjp,500)};
5
+ window._gjp && _gjp();</script><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}#gbar{height:22px;padding-left:2px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#guser{padding-bottom:7px !important}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.73em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb3{color:#00c !important}.gb3{text-decoration:none}</style><script>google.y={};google.x=function(e,g){google.y[e.id]=[e,g];return false};</script></head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="document.f.q.focus();if(document.images)new Image().src='/images/nav_logo4.png'" topmargin=3 marginheight=3><textarea id=csi style=display:none></textarea><div id=gbar><nobr><b class=gb1>Web</b> <a href="http://images.google.com/imghp?hl=en&tab=wi" class=gb1>Images</a> <a href="http://maps.google.com/maps?hl=en&tab=wl" class=gb1>Maps</a> <a href="http://news.google.com/nwshp?hl=en&tab=wn" class=gb1>News</a> <a href="http://video.google.com/?hl=en&tab=wv" class=gb1>Video</a> <a href="http://mail.google.com/mail/?hl=en&tab=wm" class=gb1>Gmail</a> <a href="http://www.google.com/intl/en/options/" class=gb3><u>more</u> &raquo;</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><div align=right id=guser style="font-size:84%;padding:0 0 4px" width=100%><nobr><a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Den%26source%3Diglk&usg=AFQjCNFA18XPfgb7dKnXfKz7x7g1GDH1tg">iGoogle</a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.com/&hl=en">Sign in</a></nobr></div><center><br clear=all id=lgpd><img alt="Google" height=110 src="/intl/en_ALL/images/logo.gif" width=276><br><br><form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%>&nbsp;</td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25%><font size=-2>&nbsp;&nbsp;<a href=/advanced_search?hl=en>Advanced Search</a><br>&nbsp;&nbsp;<a href=/preferences?hl=en>Preferences</a><br>&nbsp;&nbsp;<a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/intl/en/ads/">Advertising&nbsp;Programs</a> - <a href="/services/">Business Solutions</a> - <a href="/intl/en/about.html">About Google</a></font><p><font size=-2>&copy;2009 - <a href="/intl/en/privacy.html">Privacy</a></font></p></center><div id=xjsd><script>if(google.y)google.y.first=[];google.dstr=[];google.rein=[];window.setTimeout(function(){var xjs=document.createElement('script');xjs.src='/extern_js/f/CgJlbhICdXMgACswCjgVLCswDjgFLCswGDgDLCswJTjJiAEsKzAmOAQsKzAnOAAs/44fSbrQUBfg.js';(document.getElementById('xjsd') || document.body).appendChild(xjs)},0);google.y.first.push(function(){google.ac.i(document.f,document.f.q,'','')})</script></div><script>(function(){
6
+ function a(){google.timers.load.t.ol=(new Date).getTime();google.report&&google.report(google.timers.load,{ei:google.kEI,e:google.kEXPI})}if(window.addEventListener)window.addEventListener("load",a,false);else if(window.attachEvent)window.attachEvent("onload",a);google.timers.load.t.prt=(new Date).getTime();
7
+ })();
8
+ </script>
@@ -0,0 +1,231 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+ <html><head>
3
+ <title>south florida jewelry classifieds - craigslist</title>
4
+
5
+ <meta name="description" content="craigslist jewelry classifieds for south florida ">
6
+ <meta name="keywords" content="south florida jewelry craigslist, classifieds, want ads ">
7
+
8
+
9
+
10
+ <link rel=alternate type="application/rss+xml" href="index.rss" title="RSS feed for craigslist | jewelry in south florida ">
11
+ <link rel="stylesheet" title="craigslist" href="http://www.craigslist.org/styles/craigslist.css" type="text/css" media="all">
12
+ </head>
13
+
14
+ <body class="toc">
15
+
16
+ <a name="top"></a>
17
+
18
+ <div class="bchead"><span id="ef">
19
+
20
+ [ <a href="http://www.craigslist.org/about/help/">help</a> ]
21
+ [ <a href="https://post.craigslist.org/mia/S">post</a> ]</span>
22
+
23
+ <a href="/"> south florida craigslist</a> &gt; <a href="/jwl/">jewelry</a><div id="satabs"> <b>all south florida</b> <a href="/mdc/jwl/">miami / dade</a> <a href="/brw/jwl/">broward county</a> <a href="/pbc/jwl/">palm beach co</a> </div>
24
+ </div>
25
+
26
+ <blockquote>
27
+ <form action="/search/jwl" method="get" onsubmit="ckCAbb();">
28
+
29
+ <script type="text/javascript"><!--
30
+ function ckCAbb() {
31
+ t = document.getElementById("cAbb");
32
+ if (t.value == "jwl") { t.disabled = true; }
33
+ }
34
+ -->
35
+ </script>
36
+
37
+ <table width="95%" cellpadding="2" style="white-space: nowrap; background:#eee; border:1px solid gray;" summary="">
38
+ <tr>
39
+ <td align="right" width="1">search for:</td>
40
+ <td width="30%"><input id="query" name="query" size="30" value=""> in:
41
+ <select id="cAbb" name="catAbbreviation">
42
+ <option value="ccc">all community<option value="eee">all event<option value="sss">all for sale / wanted<option disabled value="">--<option value="art"> art &amp; crafts
43
+ <option value="pts"> auto parts
44
+ <option value="bab"> baby &amp; kid stuff
45
+ <option value="bar"> barter
46
+ <option value="bik"> bicycles
47
+ <option value="boa"> boats
48
+ <option value="bks"> books
49
+ <option value="bfs"> business
50
+ <option value="cta"> cars &amp; trucks - all
51
+ <option value="ctd"> cars &amp; trucks - by dealer
52
+ <option value="cto"> cars &amp; trucks - by owner
53
+ <option value="emd"> cds / dvds / vhs
54
+ <option value="clo"> clothing
55
+ <option value="clt"> collectibles
56
+ <option value="sys"> computers &amp; tech
57
+ <option value="ele"> electronics
58
+ <option value="grd"> farm &amp; garden
59
+ <option value="zip"> free stuff
60
+ <option value="fua"> furniture - all
61
+ <option value="fud"> furniture - by dealer
62
+ <option value="fuo"> furniture - by owner
63
+ <option value="tag"> games &amp; toys
64
+ <option value="gms"> garage sales
65
+ <option value="for"> general
66
+ <option value="hsh"> household
67
+ <option value="wan"> items wanted
68
+ <option value="jwl" selected> jewelry
69
+ <option value="mat"> materials
70
+ <option value="mcy"> motorcycles/scooters
71
+ <option value="msg"> musical instruments
72
+ <option value="pho"> photo/video
73
+ <option value="rvs"> recreational vehicles
74
+ <option value="spo"> sporting goods
75
+ <option value="tix"> tickets
76
+ <option value="tls"> tools
77
+ <option disabled value="">--<option value="ggg">all gigs<option value="hhh">all housing<option value="jjj">all jobs<option value="ppp">all personals<option value="res">all resume<option value="bbb">all services offered</select>
78
+ <input type="submit" value="Search">
79
+ </td><td>
80
+ <label><input type="checkbox" name="srchType" value="T"
81
+ title="check this box to search only posting titles"> only search titles</label>
82
+ </td>
83
+ </tr>
84
+
85
+ <tr>
86
+ <td align="right" width="1">price:</td>
87
+ <td><input name="minAsk" size="6" value="min" onfocus="value=''">&nbsp;<input name="maxAsk" size="6" value="max" onfocus="value=''">&nbsp;</td>
88
+ <td align="left"><label><input type="checkbox" name="hasPic" value="1"> has image</label></td>
89
+ </tr></table></form></blockquote><span id="showPics"></span><span id="hidePics"></span>
90
+
91
+ <blockquote>
92
+ <table width="95%" summary="">
93
+ <tr>
94
+ <td valign="top">[ Sat, 18 Apr 15:43:13 ]</td>
95
+ <td valign="top" id="messages"><span class="hl"> [ <a href="/about/prohibited.items">partial list of prohibited items</a> ] </span> <span class="hl"> [ <a href="http://www.recalls.gov/">avoid recalled items</a> ] </span> <span class="hl"> [ <b><a href="/about/safety">PERSONAL SAFETY TIPS</a></b> ] </span> <span class="hl"> [ <b><a href="/about/scams">AVOIDING SCAMS &amp; FRAUD</a></b> ] </span> <span class="hl"> [<a href="/cgi-bin/success.stories.cgi">success story?</a>]</span> </td>
96
+ </tr>
97
+ </table>
98
+
99
+ <h4>Sat Apr 18</h4>
100
+ <p><a href="/mdc/jwl/1128691192.html">925 Sterling Silver Dragonfly Charm Bracelet - $25 -</a> <span class="p"> img</span></p>
101
+ <p><a href="/pbc/jwl/1128689829.html"> Once in a lifetime Jewelry Clearance Not To be Missed -</a><font size="-1"> (Palm beach county)</font> <span class="p"> pic</span></p>
102
+ <p><a href="/pbc/jwl/1128684801.html">RUBY AND DIAMOND BRACELET AND RING -</a><font size="-1"> (ROYAL PALM BEACH)</font> <span class="p"> pic</span></p>
103
+ <p><a href="/brw/jwl/1126885096.html">Rolex Ladies Replica watche`s - $40 -</a><font size="-1"> (any location/ Will mail)</font></p>
104
+ <p><a href="/pbc/jwl/1128638850.html">LADYS ROLEX DAYDATE MASTERPEICE SWISS REPLICA - $350 -</a><font size="-1"> (WEST PALM)</font> <span class="p"> pic</span></p>
105
+ <p><a href="/pbc/jwl/1128624423.html">Silver And Gold Jewelry 85% Price Reduction -</a><font size="-1"> (West Palm Beach)</font> <span class="p"> pic</span></p>
106
+ <p><a href="/pbc/jwl/1128613122.html">2005 Rolex Datejust, Guaranteed Authentic - $1250 -</a> <span class="p"> pic</span></p>
107
+ <p><a href="/brw/jwl/1128605120.html">.50ct. Diamond pendant set in white gold on white gold chain - $300 -</a><font size="-1"> (Hollywood, FL)</font> <span class="p"> pic</span></p>
108
+ <p><a href="/brw/jwl/1128590656.html">MENS MOVADO--REDUCED PRICE FOR IMMEDIATE SALE - $300 -</a><font size="-1"> (COCONUT CREEK)</font> <span class="p"> pic</span></p>
109
+ <p><a href="/pbc/jwl/1128587916.html">WHITEGOLD&amp;PEARL ROLEX MASTERPEICE SWISS MADE REPLICA - $450 -</a><font size="-1"> (PALM BEACH)</font> <span class="p"> pic</span></p>
110
+ <p><a href="/mdc/jwl/1128560471.html">Authentic .5c Ice Master Watch !! - 350$ - $350 -</a><font size="-1"> (SW 8TH &amp; 107TH AVE)</font> <span class="p"> img</span></p>
111
+ <p><a href="/brw/jwl/1128506430.html">Jewelry boxes keepsakes - $3 -</a><font size="-1"> (weston / margate)</font> <span class="p"> pic</span></p>
112
+ <p><a href="/mdc/jwl/1128536077.html">Mother's day Hearts!!! -</a></p>
113
+ <p><a href="/pbc/jwl/1128514142.html">14k gold 30inch cuban link chain!!!! - $2500 -</a><font size="-1"> (lake worth)</font> <span class="p"> pic</span></p>
114
+ <p><a href="/pbc/jwl/1128503504.html">GORGEOUS 1.10 tcw diamond and 14k yellow gold engagement ring - $1800 -</a> <span class="p"> pic</span></p>
115
+ <p><a href="/brw/jwl/1128498786.html">Men's Ring - Beautiful Dark Colombian Emeralds - $395 -</a><font size="-1"> (N Broward - Boca Area)</font> <span class="p"> img</span></p>
116
+ <p><a href="/brw/jwl/1128488351.html">18.EdHardy,Coach 19$BCC ,necklaces12Cilo,rings$32 -</a> <span class="p"> pic</span></p>
117
+ <p><a href="/mdc/jwl/1128484673.html">!!fashion jewelry for sale!!! -</a><font size="-1"> (hialeah)</font> <span class="p"> pic</span></p>
118
+ <p><a href="/mdc/jwl/1128458995.html">NO RESERVE AUCTION 500+ items incl. Diamond Bracelet -</a><font size="-1"> (Kendall)</font> <span class="p"> img</span></p>
119
+ <p><a href="/brw/jwl/1128482539.html">NEED CASH? - WE BUY Broken / Unworn GOLD - Hollywood/Davie/Ft. Laud. -</a><font size="-1"> (Broward County)</font> <span class="p"> pic</span></p>
120
+ <p><a href="/pbc/jwl/1128475731.html">Womens Wedding Ring Going once Going twice - $150 -</a><font size="-1"> (boca)</font> <span class="p"> pic</span></p>
121
+ <p><a href="/mdc/jwl/1128451819.html">Breitling Super Avenger w/ Diamonds - $5500 -</a><font size="-1"> (Miami)</font> <span class="p"> pic</span></p>
122
+ <p><a href="/mdc/jwl/1128428824.html">CHANEL NECKLACE/ CHANEL BRACELET - $55 -</a><font size="-1"> (HIALEAH )</font> <span class="p"> pic</span></p>
123
+ <p><a href="/mdc/jwl/1128403733.html">chanel charm bracelet / necklace - $45 -</a><font size="-1"> (hialeah)</font> <span class="p"> pic</span></p>
124
+ <p><a href="/pbc/jwl/1128377402.html">WOW! NO RESERVE AUCTION 100's of items incl. Rolex Watch -</a><font size="-1"> (West Palm Beach)</font> <span class="p"> img</span></p>
125
+ <p><a href="/mdc/jwl/1128379108.html">Sterling Silver Collar Necklace with Rose Quartz Stone - $450 -</a><font size="-1"> (Spokane, WA)</font> <span class="p"> pic</span></p>
126
+ <p><a href="/brw/jwl/1128359039.html">Ap Audemars Piguet good replica - $300 -</a><font size="-1"> (DEERFIELD BEACH)</font> <span class="p"> pic</span></p>
127
+ <p><a href="/mdc/jwl/1128358980.html">Sterling Silver Necklace with Heart Shaped Pendant - $20 -</a><font size="-1"> (Richmond Heights/Cutler Bay Area)</font></p>
128
+ <p><a href="/mdc/jwl/1128348786.html">Tiffany &amp; Co. Men's 1837 Bracelet - $300 -</a><font size="-1"> (Miami)</font> <span class="p"> pic</span></p>
129
+ <p><a href="/pbc/jwl/1128307272.html">antique 14kt. watch (pocket) - $435 -</a><font size="-1"> (boynton beach)</font> <span class="p"> pic</span></p>
130
+ <p><a href="/mdc/jwl/1128304395.html">Hublot - $300 -</a><font size="-1"> (Hollywood)</font> <span class="p"> pic</span></p>
131
+ <p><a href="/pbc/jwl/1128293904.html">DIAMOND STUD EARRINGS-1.25 CARATS - $850 -</a><font size="-1"> (BOYNTON BEACH)</font> <span class="p"> pic</span></p>
132
+ <p><a href="/pbc/jwl/1128286106.html">DIAMOND/14KT WG TRIPLE CIRCLE OF LIFE PENDANT &amp; CHAIN - $115 -</a><font size="-1"> (BOYNTON BEACH)</font> <span class="p"> pic</span></p>
133
+ <p><a href="/brw/jwl/1128230783.html">gold party - $1 -</a><font size="-1"> (sunrise )</font></p>
134
+ <p><a href="/brw/jwl/1128232569.html">14K GOLD CHAIN - $800 -</a><font size="-1"> (DAVIE)</font> <span class="p"> pic</span></p>
135
+ <p><a href="/brw/jwl/1128228413.html"> 14K GOLD FIGURO CHAIN - $850 -</a><font size="-1"> (DAVIE)</font> <span class="p"> pic</span></p>
136
+ <p><a href="/pbc/jwl/1128205175.html">WE BUY GOLD/WATCHES -</a><font size="-1"> (Boca Raton)</font> <span class="p"> img</span></p>
137
+ <p><a href="/pbc/jwl/1128201980.html">MENS ROLEX CELLINI CESTELLO 18K GOLD - $4200 -</a><font size="-1"> (BOCA RATON)</font></p>
138
+ <p><a href="/mdc/jwl/1128201634.html">Tiffany Necklace and Bracelet Set - $100 -</a><font size="-1"> (Miami Gardens)</font> <span class="p"> pic</span></p>
139
+ <p><a href="/pbc/jwl/1128199559.html">CARTIER SANTOS 100 - $3750 -</a><font size="-1"> (BOCA RATON)</font></p>
140
+ <p><a href="/pbc/jwl/1128197851.html">ROLEX DATEJUST WATCH----- WAY UNDER RETAIL WITH ORIGINAL RECEIPT! - $5700 -</a><font size="-1"> (Boca Raton)</font></p>
141
+ <p><a href="/pbc/jwl/1128196560.html">ROLEX YACHTMASTER 18K GOLD - $11500 -</a><font size="-1"> (BOCA RATON)</font></p>
142
+ <p><a href="/pbc/jwl/1128195768.html">14kt.GOLD PEN/PENCIL-ANTIQUE - $590 -</a><font size="-1"> (BOYNTON BEACH)</font> <span class="p"> pic</span></p>
143
+ <p><a href="/pbc/jwl/1128194309.html">CARTIER PASHA MENS OR LADIES - $4000 -</a><font size="-1"> (BOCA RATON)</font></p>
144
+ <p><a href="/pbc/jwl/1128192190.html">ROLEX SS MENS DAYTONA - $8900 -</a><font size="-1"> (BOCA RATON)</font></p>
145
+ <p><a href="/pbc/jwl/1128188734.html">Ladies Cartier Panther CHEAP! - $1750 -</a><font size="-1"> (Boca Raton)</font></p>
146
+ <p><a href="/mdc/jwl/1128183009.html">gorgeous timepiece luxury watch save up to 70 to 90% off mrsp - $1 -</a><font size="-1"> (nyc)</font> <span class="p"> pic</span></p>
147
+ <p><a href="/brw/jwl/1127450202.html">Rolex Date 2 Tone model - $2400 -</a><font size="-1"> (hollywood)</font></p>
148
+ <p><a href="/mdc/jwl/1128174126.html">Men's Rolex 16613 - $7000 -</a><font size="-1"> (Upper Keys)</font> <span class="p"> pic</span></p>
149
+ <p><a href="/mdc/jwl/1128137108.html">BVLGARI Bzero1 - $1000 -</a><font size="-1"> (kendall)</font> <span class="p"> pic</span></p>
150
+ <p><a href="/pbc/jwl/1128156291.html">Yellow Gold Emerald &amp; Diamond Ring - $3500 -</a> <span class="p"> pic</span></p>
151
+ <p><a href="/brw/jwl/1128153850.html">100 GOLD PLATED HIP HOP PENDANTS AND CHAINS.MUST SELL - $5 -</a><font size="-1"> (305-934-1199-ALL MIAMI)</font> <span class="p"> img</span></p>
152
+ <p><a href="/pbc/jwl/1128147908.html">Sterling Silver USA Charm - $5 -</a><font size="-1"> (Greenacres)</font> <span class="p"> pic</span></p>
153
+ <p><a href="/pbc/jwl/1128146571.html">Small Jewelry Boxes - $5 -</a><font size="-1"> (Greenacres)</font> <span class="p"> pic</span></p>
154
+ <p><a href="/pbc/jwl/1128130586.html">Priced To Sell Today...!!...ROLEX 18K GOLD SUBMARINER...!! -</a><font size="-1"> (Boca Raton)</font> <span class="p"> img</span></p>
155
+ <p><a href="/pbc/jwl/1128128516.html">I'm looking to buy Submariner/Daytona Rolex..cash -</a></p>
156
+ <p><a href="/brw/jwl/1128128319.html">BUYING ALL GOLD JEWELRY Top $$ Paid! Broken,Etc. -</a><font size="-1"> (Miami to the Palm Beaches)</font> <span class="p"> img</span></p>
157
+ <p><a href="/pbc/jwl/1128125962.html">14K Diamond Insert Engagement Ring and Band - Insert Ring - $1200 -</a> <span class="p"> pic</span></p>
158
+ <p><a href="/brw/jwl/1128119024.html">Jewelry, bags and carry ons, new -</a><font size="-1"> (Hallandale Beach)</font></p>
159
+ <p><a href="/pbc/jwl/1128106740.html">All Coral Sterling Silver Earrings - $15 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
160
+ <p><a href="/pbc/jwl/1128105924.html">14K Sapphire, Opal Earrings .&lt;&lt;&lt;&lt;&lt;&lt;&lt; - $38 -</a><font size="-1"> (Wellington)</font></p>
161
+ <p><a href="/pbc/jwl/1128105079.html">LOT OF STERLING SILVER TOE RINGS/MUST BUY ALL - $2 -</a><font size="-1"> (Wellington)</font></p>
162
+ <p><a href="/pbc/jwl/1128103460.html">Need Fixtures -- Glass Cubes, Neck Displays, Black Pads, ETC. -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
163
+ <p><a href="/pbc/jwl/1128102409.html">All Kinds Of Turqoise,Coral, Onyx, Amythist Necklaces - $5 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
164
+ <p><a href="/pbc/jwl/1128100130.html">Surgical Steel Belly Rings - $3 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
165
+ <p><a href="/pbc/jwl/1128099285.html">Silk, Suede, and Leather Cords for Sale--Liquidation! - $3 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
166
+ <p><a href="/brw/jwl/1128099106.html">Old Vintage Miriam Haskell Pin - $75 -</a><font size="-1"> (Oakland Park)</font> <span class="p"> pic</span></p>
167
+ <p><a href="/pbc/jwl/1128098406.html">Snake Bangle Sterling Silver Bracelet/Blue,White and Red Eye CZ - $75 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
168
+ <p><a href="/brw/jwl/1128077267.html">Auction of INCREDIBLE items incl Rolex Watch +more -</a><font size="-1"> (Ft Lauderdale)</font> <span class="p"> img</span></p>
169
+ <p><a href="/pbc/jwl/1128087979.html">GET THE MOST $$$$$ FOR THE GOLD YOU SELL -</a><font size="-1"> (PALM BEACH COUNTY)</font> <span class="p"> pic</span></p>
170
+ <p><a href="/mdc/jwl/1128070513.html">Brand New Tiffany Toggle 8" Bracelet $55 OBO Call 786.371.1000 -</a><font size="-1"> (Miami Lakes)</font> <span class="p"> pic</span></p>
171
+ <p><a href="/mdc/jwl/1128068456.html">Tiffany &amp; Co. 16" Link Chain Necklace $85 OBO Call 786.371.1000 -</a><font size="-1"> (Miami Lakes)</font> <span class="p"> pic</span></p>
172
+ <p><a href="/mdc/jwl/1128066856.html">Tiffany &amp; Co. 8" Link Chain Bracelet $65 OBO Call 786.371.1000 -</a><font size="-1"> (Miami Lakes)</font> <span class="p"> pic</span></p>
173
+ <p><a href="/brw/jwl/1128071578.html">Diamonds - raw, uncut - auction tonight 4/18 -</a><font size="-1"> (Auction 84, Fort Lauderdale, FL)</font> <span class="p"> pic</span></p>
174
+ <p><a href="/pbc/jwl/1128066254.html">Men's 14k tri-color wedding ring size 10.5 - $150 -</a><font size="-1"> (Palm Beach Gardens)</font> <span class="p"> pic</span></p>
175
+ <p><a href="/pbc/jwl/1128057648.html">Tiffany Buttercup Ring - $10000 -</a><font size="-1"> (West Palm Beach)</font> <span class="p"> pic</span></p>
176
+ <p><a href="/mdc/jwl/1128029258.html">5.23CWT LOOSE ROUND SOLITAIRE. G COLOR/ SI2 CLARITY. SHOP AROUND GIVIN - $16500 -</a><font size="-1"> (G IT AWAY! NOT TREATED BOUGHT RIGHT SELLING IT RIGHT. CALL U)</font></p>
177
+ <p><a href="/mdc/jwl/1128008509.html">Jewelry And Watches At Unbelievable Prices -</a><font size="-1"> (Miami)</font> <span class="p"> pic</span></p>
178
+ <p><a href="/mdc/jwl/1127965465.html">Two Kissing Dolphin Pendent - $10 -</a> <span class="p"> img</span></p>
179
+ <p><a href="/pbc/jwl/1127861064.html"> VINTAGE custom JEWELRY AND MORE -</a><font size="-1"> (WELLINGTON)</font></p>
180
+ <p><a href="/brw/jwl/1127789460.html">++++ATT DIVERS: Citizen Quartz Aqualand Promaster - $295 -</a><font size="-1"> (Cooper City)</font> <span class="p"> img</span></p>
181
+ <h4>Fri Apr 17</h4>
182
+ <p><a href="/brw/jwl/1127690849.html">Isis Oh Collections -</a><font size="-1"> (Wilton Manors)</font> <span class="p"> pic</span></p>
183
+ <p><a href="/pbc/jwl/1127838919.html">RARE CHINESE JADE 14K RING-ONE OF A KIND/COLLECTIBLE-Don't Miss This!! - $699 -</a> <span class="p"> pic</span></p>
184
+ <p><a href="/mdc/jwl/1127835599.html">HUGE 14K GOLD MEZUZAH WITH DIAMONDS-A STEAL!! - $999 -</a> <span class="p"> pic</span></p>
185
+ <p><a href="/mdc/jwl/1127815294.html">swiss legends watch brand new never worn - $400 -</a><font size="-1"> (aventura )</font> <span class="p"> pic</span></p>
186
+ <p><a href="/pbc/jwl/1127736951.html">Brass 14kt Gold Plated Mens Chain 24" w/Jesus Cross Charm - $90 -</a><font size="-1"> (Wellington)</font> <span class="p"> pic</span></p>
187
+ <p><a href="/brw/jwl/1127723668.html">Beautiful Swarovski Rosary - $10 -</a><font size="-1"> (Davie, Fl)</font> <span class="p"> pic</span></p>
188
+ <p><a href="/pbc/jwl/1127636820.html">Mens Movado Watch - $2200 -</a><font size="-1"> (Treasure Coast)</font> <span class="p"> pic</span></p>
189
+ <p><a href="/brw/jwl/1127604144.html">We Buy Diamonds and Coins -</a><font size="-1"> (Estate Purchases or 1 of a Kind)</font> <span class="p"> pic</span></p>
190
+ <p><a href="/mdc/jwl/1127606545.html">5.23 CWT. LOOSE ROUND SOLITAIRE. COLOR G / CLARITY I2. 55% BELOW WHO -</a><font size="-1"> (LESALE. OR RAPAPORT. BOUGHT IT RIGHT SEL)</font></p>
191
+ <p><a href="/mdc/jwl/1127603417.html">fine jewelry woman's diamond ring - $1300 -</a><font size="-1"> (davie,fl)</font> <span class="p"> pic</span></p>
192
+ <p><a href="/brw/jwl/1127586876.html">MENS DIAMOND RING DEAL - $199 -</a><font size="-1"> (HOLLYWOOD)</font></p>
193
+ <p><a href="/pbc/jwl/1127573357.html">Know the Truth about "Reproduction Watches" and what they really Cost - $1 -</a><font size="-1"> (WORLDWIDE)</font> <span class="p"> pic</span></p>
194
+ <p><a href="/pbc/jwl/1127570172.html">35pc.. GREAT FOR RESALE - $30 -</a><font size="-1"> (West Palm Beach)</font> <span class="p"> pic</span></p>
195
+ <p><a href="/pbc/jwl/1127539000.html">WOW! NO MINIMUM AUCTION 500+ items incl. Diamond Bracelet -</a><font size="-1"> (Boca Raton)</font> <span class="p"> img</span></p>
196
+ <p><a href="/mdc/jwl/1127538841.html">retro vintage clothing and jewelry -</a><font size="-1"> (nh)</font> <span class="p"> pic</span></p>
197
+ <p><a href="/mdc/jwl/1127497359.html">Online Auction 100's of items NO Reserve inc.Diamond Bracelet -</a><font size="-1"> (Kendall)</font> <span class="p"> img</span></p>
198
+ <p><a href="/pbc/jwl/1127528860.html">1.12 DIAMOND (loose stone) - $3300 -</a><font size="-1"> (BocaRaton)</font></p>
199
+ <p><a href="/pbc/jwl/1127506726.html">Rolex Datejust 79173 Gold 18K Stainless Ladies New OBO - $3000 -</a><font size="-1"> (West Palm Beach)</font> <span class="p"> pic</span></p>
200
+ <p><a href="/pbc/jwl/1127397237.html">ARMANI FASHION DESIGNER MENS WATCH -</a><font size="-1"> (ARMANI 18)</font> <span class="p"> pic</span></p>
201
+
202
+
203
+ <p align="center"><font size="4"><a href="index100.html">next 100 postings</a></font>
204
+
205
+ <div id="footer">
206
+ <hr>
207
+ <span id="copy">
208
+ Copyright &copy; 2009 craigslist, inc.<br>
209
+ <a href="#top">Back to top of page</a>
210
+ </span>
211
+ <span class="rss">
212
+ <a class="l" href="http://miami.craigslist.org/jwl/index.rss">RSS</a>
213
+ <a href="http://www.craigslist.org/about/rss">(?)</a><br>
214
+ <a class="y" href="http://add.my.yahoo.com/rss?url=http://miami.craigslist.org/jwl/index.rss">add to My Yahoo!</a>
215
+ </span>
216
+ </div>
217
+ <br><br>
218
+
219
+ <div id="floater">&nbsp;</div>
220
+
221
+ </blockquote>
222
+ <script type="text/javascript" src="http://www.craigslist.org/js/jquery.js"></script><script type="text/javascript" src="http://www.craigslist.org/js/tocs.js"></script>
223
+ <script type="text/javascript">
224
+ <!--
225
+ initImgs();
226
+ -->
227
+ </script>
228
+
229
+
230
+ </body>
231
+ </html>