حفظ جداول HTML في قاعدة البيانات
-
09-06-2019 - |
سؤال
أحاول استخراج جدول HTML وحفظ بياناته في قاعدة بيانات.ما هي الاستراتيجيات/الحلول التي وجدتها مفيدة في التعامل مع هذا البرنامج.
أنا أكثر راحة مع Java وPHP ولكن الحل بأي لغة سيكون مفيدًا حقًا.
يحرر:لمزيد من التفاصيل، يوفر UTA (نظام حافلات سولت ليك) جداول الحافلات على موقعه على الإنترنت.يظهر كل جدول في جدول يحتوي على المحطات في الرأس وأوقات المغادرة في الصفوف.أرغب في الاطلاع على الجداول وحفظ المعلومات الموجودة في الجدول في نموذج يمكنني بعد ذلك الاستعلام عنه.
هنا نقطة البداية للجداول
المحلول
كل هذا يتوقف على مدى جودة HTML الخاص بك في الكشط؟إذا كان XHTML صالحًا، فيمكنك ببساطة استخدام بعض استعلامات XPath عليه للحصول على ما تريد.
مثال على xpath في PHP: http://blogscoped.com/archive/2004_06_23_index.html#108802750834787821
فئة مساعدة لكشط جدول في مصفوفة: http://www.tgreer.com/class_http_php.html
نصائح أخرى
هناك كتاب جميل حول هذا الموضوع: Spidering Hacks بقلم كيفن هيمينواي وتارا كاليشين.
لقد وجدت أن لغات البرمجة النصية هي بشكل عام أكثر ملاءمة للقيام بمثل هذه المهام.أنا شخصيا أفضّل لغة بايثون، لكن لغة PHP ستعمل كذلك.يعد تقطيع السلاسل وفرمها وتحليلها في Java بمثابة عمل شاق للغاية.
لقد حاولت تجريف الشاشة من قبل، لكنني وجدت أنها هشة للغاية، خاصة مع التعليمات البرمجية التي يتم إنشاؤها ديناميكيًا.لقد عثرت على محلل DOM تابع لجهة خارجية واستخدمته للتنقل في التعليمات البرمجية المصدر باستخدام أنماط مطابقة تشبه Regex للعثور على البيانات التي أحتاجها.
اقترحت محاولة معرفة ما إذا كان أصحاب الموقع لديهم واجهة برمجة تطبيقات منشورة (غالبًا خدمات ويب) لاسترداد البيانات من نظامهم.إذا لم يكن الأمر كذلك، حظا سعيدا لك.
إذا كان ما تريده هو نموذج جدول CSV، فيمكنك استخدام هذا:باستخدام بايثون:
على سبيل المثال، تخيل أنك تريد استخراج أسعار العملات الأجنبية في شكل ملف CSV من بعض المواقع مثل: com.fxoanda
ثم...
from BeautifulSoup import BeautifulSoup
import urllib,string,csv,sys,os
from string import replace
date_s = '&date1=01/01/08'
date_f = '&date=11/10/08'
fx_url = 'http://www.oanda.com/convert/fxhistory?date_fmt=us'
fx_url_end = '&lang=en&margin_fixed=0&format=CSV&redirected=1'
cur1,cur2 = 'USD','AUD'
fx_url = fx_url + date_f + date_s + '&exch=' + cur1 +'&exch2=' + cur1
fx_url = fx_url +'&expr=' + cur2 + '&expr2=' + cur2 + fx_url_end
data = urllib.urlopen(fx_url).read()
soup = BeautifulSoup(data)
data = str(soup.findAll('pre', limit=1))
data = replace(data,'[<pre>','')
data = replace(data,'</pre>]','')
file_location = '/Users/location_edit_this'
file_name = file_location + 'usd_aus.csv'
file = open(file_name,"w")
file.write(data)
file.close()
بمجرد الحصول عليها في هذا النموذج يمكنك تحويل البيانات إلى أي نموذج تريده.
في ظل خطر بدء عاصفة هنا على SO، أقترح أنه إذا لم يتغير تنسيق الجدول أبدًا، فيمكنك الابتعاد عن استخدام التعبيرات العادية لتحليل المحتوى الذي تحتاجه والتقاطه.
لقد أغفل هاكر البيانو HTML::TableExtract الوحدة، والتي تم تصميمها لهذا النوع من الأشياء بالضبط.كنت لا تزال بحاجة LWP لاسترجاع الجدول.
سيكون هذا أسهل بكثير مع لغة Perl، ووحدات CPAN التالية:
- http://metacpan.org/pod/HTML::Parser
- http://metacpan.org/pod/LWP
- http://metacpan.org/pod/DBD/mysql
- http://metacpan.org/pod/DBI.pm
CPAN هي آلية التوزيع الرئيسية لوحدات Perl، ويمكن الوصول إليها عن طريق تشغيل أمر shell التالي، على سبيل المثال:
# cpan HTML::Parser
إذا كنت تستخدم نظام التشغيل Windows، فستكون الأمور أكثر إثارة للاهتمام، ولكن لا يزال بإمكانك القيام بذلك: http://www.perlmonks.org/?node_id=583586