تجريف ملفات HTML متعددة إلى CSV
-
06-09-2019 - |
سؤال
أحاول أن أشتري صفوف أكثر من 1200 ملف من ملفات. على جهاز الكمبيوتر الخاص بي هم هنا ملف: ///home/phi/data/nhl/pl07-08/pl020001.htm '. ملفات .htm هذه متتابعة من * 20001.htm حتى * 21230.htm. خطتي هي في نهاية المطاف إرم بياناتي في MySQL أو SQLITE عبر تطبيق جدول بيانات أو مباشرة إذا كان بإمكاني الحصول على ملف .csv نظيف من هذه العملية.
هذه هي محاولتي الأولى في التعليمات البرمجية (بيثون)، تجرها، وأنا مثبت للتو Ubuntu 9.04 على بلدي بنتيوم بنتيوم الرابع. وغني عن القول أنني newb ولدي بعض حواجز الطرق.
كيف يمكنني الحصول على ميكانيكي للذهاب إلى جميع الملفات في الدليل بالترتيب. يمكن لآلية حتى القيام بذلك؟ هل يمكن لآلية / بيثون / جميلة قراءة عنوان URL "الملف: ///" أو هل هناك طريقة أخرى لإشارةه إلى /home/phi/data/nhl/pl07-08/pl020001.htm؟ هل هو ذكيا للقيام بذلك في 100 أو 250 زيادات أو فقط أرسل كل 1230؟
أنا فقط بحاجة إلى صفوف تبدأ بهذا "<tr class="evenColor">
"ونهاية مع هذا"</tr>
". من الناحية المثالية، أريد فقط الصفوف التي تحتوي على" لقطة "|" ملكة جمال "|" الهدف "داخلها ولكن أريد الصف كله (كل عمود). لاحظ أن"المرمى"في جريئة، هل يجب علي تحديد هذا؟ هناك 3 طاولات لكل ملف HTM.
كما أود اسم الملف الأصل (pl020001.htm) ليتم تضمينها في الصفوف التي أخرجها حتى أتمكن من معرفها في عمودها في قاعدة البيانات النهائية. وبعد أنا لا أعرف حتى مكان البدء في ذلك. هذا ما لدي حتى الآن:
#/usr/bin/python
from BeautifulSoup import BeautifulSoup
import re
from mechanize import Browser
mech = Browser()
url = "file:///home/phi/Data/NHL/pl07-08/PL020001.HTM"
##but how do I do multiple urls/files? PL02*.HTM?
page = mech.open(url)
html = page.read()
soup = BeautifulSoup(html)
##this confuses me and seems redundant
pl = open("input_file.html","r")
chances = open("chancesforsql.csv,"w")
table = soup.find("table", border=0)
for row in table.findAll 'tr class="evenColor"'
#should I do this instead of before?
outfile = open("shooting.csv", "w")
##how do I end it?
يجب أن أستخدم الخمول أو شيء من هذا القبيل؟ فقط محطة في أوبونتو 9.04؟
المحلول
لن تحتاج إلى ميكانيكية. نظرا لأنني لا أعرف بالضبط محتوى HTML، فسأحاول أن أرى المباريات الأولية أولا. مثله:
import glob
from BeautifulSoup import BeautifulSoup
for filename in glob.glob('/home/phi/Data/*.htm'):
soup = BeautifulSoup(open(filename, "r").read()) # assuming some HTML
for a_tr in soup.findAll("tr", attrs={ "class" : "evenColor" }):
print a_tr
ثم اختر الأشياء التي تريدها وكتابتها إلى Stdout مع الفواصل (وإعادة توجيهها> إلى ملف). أو اكتب CSV عبر بيثون.
نصائح أخرى
إجابة Myyn تبدو وكأنها بداية رائعة بالنسبة لي. شيء واحد أشر إليه أن أكون حظا حظا هو:
import glob
for file_name in glob.glob('/home/phi/Data/*.htm'):
#read the file and then parse with BeautifulSoup
لقد وجدت كل من os
و glob
الواردات لتكون مفيدة حقا لتشغيل الملفات في الدليل.
أيضا، بمجرد أن تستخدم a لحلقة بهذه الطريقة، لديك file_name
ما يمكنك تعديله للاستخدام في ملف الإخراج، بحيث ستطابق أسماء ملفات الإخراج عن أسماء ملفات الإدخال.