سؤال

لقد كنت أبحث في مكتبات XML وHTML على Rubyforge عن طريقة بسيطة لسحب البيانات من صفحة الويب.على سبيل المثال، إذا كنت أرغب في تحليل صفحة مستخدم على stackoverflow، فكيف يمكنني تحويل البيانات إلى تنسيق قابل للاستخدام؟

لنفترض أنني أريد تحليل صفحة المستخدم الخاصة بي للحصول على نقاط السمعة الحالية وقائمة الشارات.لقد حاولت تحويل المصدر الذي تم استرداده من صفحة المستخدم الخاصة بي إلى ملف xml ولكن فشل التحويل بسبب فقدان عنصر div.أعلم أنه يمكنني إجراء مقارنة سلسلة والعثور على النص الذي أبحث عنه، ولكن يجب أن تكون هناك طريقة أفضل بكثير للقيام بذلك.

أريد دمج هذا في برنامج نصي بسيط ينشر بيانات المستخدم الخاصة بي في سطر الأوامر، وربما يوسعها إلى تطبيق واجهة المستخدم الرسومية.

هل كانت مفيدة؟

المحلول

نصائح أخرى

لسوء الحظ، يدعي stackoverflow أنه XML ولكنه في الواقع ليس كذلك. هبريكوت ومع ذلك، يمكنك تحليل حساء العلامة هذا إلى شجرة من العناصر لك.

require 'hpricot'
require 'open-uri'

doc = Hpricot(open("http://stackoverflow.com/users/19990/armin-ronacher"))
reputation = (doc / "td.summaryinfo div.summarycount").text.gsub(/[^\d]+/, "").to_i

وهكذا دواليك.

يحاول com.hpricot, ، حسنا...مذهل

لقد استخدمته عدة مرات لتجريف الشاشة.

أنا دائمًا أحب حقًا ما يكتبه إيليا جريجوريك وهو كتب وظيفة لطيفة حول استخدام hpricot.

أنا أيضاً قراءة هذا المنصب منذ فترة ويبدو أنه سيكون مفيدًا لك.

لم أفعل ذلك بنفسي، لذا YMMV لكن هذه تبدو مفيدة جدًا.

أحد الأشياء التي واجهتها أثناء محاولتي القيام بذلك من قبل هو أن عددًا قليلاً من صفحات الويب عبارة عن مستندات XML جيدة التنسيق.قد يكون Hpricot قادرًا على التعامل مع ذلك (لم أستخدمه) ولكن عندما كنت أقوم بمشروع مماثل في الماضي (باستخدام Python ومكتبتها المضمنة في وظائف التحليل) فقد ساعدني في الحصول على معالج مسبق لتنظيف لغة البرمجة.لقد استخدمت روابط بايثون ل HTML مرتب لأن هذا جعل الحياة أسهل كثيرًا.روابط روبي هي هنا لكنني لم أحاول لهم.

حظ سعيد!

يبدو أنه موضوع قديم ولكن هنا موضوع جديد.مثال الحصول على السمعة:

#!/usr/bin/env ruby

require 'rubygems'
require 'hpricot'
require 'open-uri'

user = "619673/100kg"
html = "http://stackoverflow.com/users/%s?tab=reputation"

page = html % user
puts page

doc = Hpricot(open(page))
pars = Array.new
doc.search("div[@class='subheader user-full-tab-header']/h1/span[@class='count']").text.each do |p|
  pars << p
end

puts "reputation " + pars[0]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top