سؤال

المشكلة

استعمل الأداة في العمل الذي يتيح لي القيام الاستفسارات و العودة الجداول HTML من المعلومات.ليس لدي أي نوع من الخلفية الوصول إليها.

الكثير من هذه المعلومات سيكون أكثر فائدة إذا كنت يمكن وضعه في جدول بيانات الفرز ، حيث بلغ متوسطها ، إلخ. كيف يمكنني الشاشة تتخلص من هذه البيانات إلى ملف CSV?

فكرتي الأولى

منذ أن عرفت مسج, ظننت أنني قد تستخدم لتجريد من الجدول التنسيق على الشاشة ، إدراج الفواصل فواصل الأسطر ، مجرد نسخ الفوضى في المفكرة ثم حفظ كملف CSV. أي أفكار أفضل ؟

الحل

نعم, الناس, كان حقا سهلة كما النسخ واللصق.لا أشعر سخيفة.

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

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

المحلول

  • حدد في جدول HTML في أدوات واجهة المستخدم ونسخها في الحافظة (إذا كان ذلك ممكنا
  • لصقه في Excel.
  • حفظ ملف CSV

ومع ذلك, هذا هو الحل اليدوي لا الآلي واحدة.

نصائح أخرى

باستخدام بيثون:

على سبيل المثال تخيل أنك تريد أن تتخلص من الفوركس في شكل csv من بعض المواقع مثل:fxquotes

ثم...

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()

تحرير:للحصول على القيم من الجدول:على سبيل المثال من: palewire

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()

url = "http://www.palewire.com/scrape/albums/2007.html"
page = mech.open(url)

html = page.read()
soup = BeautifulSoup(html)

table = soup.find("table", border=1)

for row in table.findAll('tr')[1:]:
    col = row.findAll('td')

    rank = col[0].string
    artist = col[1].string
    album = col[2].string
    cover_link = col[3].img['src']

    record = (rank, artist, album, cover_link)
    print "|".join(record)

هذا الثعبان النسخة باستخدام (حاليا) أحدث نسخة من BeautifulSoup التي يمكن الحصول عليها باستخدام ، على سبيل المثال ،

$ sudo easy_install beautifulsoup4

السيناريو يقرأ HTML من مستوى المدخلات والمخرجات النص العثور عليها في كل الجداول في السليم تنسيق CSV.

#!/usr/bin/python
from bs4 import BeautifulSoup
import sys
import re
import csv

def cell_text(cell):
    return " ".join(cell.stripped_strings)

soup = BeautifulSoup(sys.stdin.read())
output = csv.writer(sys.stdout)

for table in soup.find_all('table'):
    for row in table.find_all('tr'):
        col = map(cell_text, row.find_all(re.compile('t[dh]')))
        output.writerow(col)
    output.writerow([])

أسهل (لأنه يوفر لك في المرة القادمة) ...

في Excel

البيانات/استيراد بيانات خارجية/استعلام ويب جديد

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

طريقتين يتبادر إلى الذهن (خصوصا بالنسبة لأولئك منا أن لا يكون Excel):

سريعة وقذرة:

نسخة من المتصفح إلى Excel حفظ كملف CSV.

أفضل حل (للاستخدام على المدى الطويل):

أكتب قليلا من التعليمات البرمجية في لغة من اختيارك سوف يتم سحب محتويات html أسفل ، وتتخلص من البتات التي تريد.ربما يمكن رمي في جميع عمليات البيانات (الفرز ، حيث بلغ متوسطها ، الخ) على رأس استرجاع البيانات.هكذا, لديك فقط لتشغيل التعليمات البرمجية الخاصة بك وتحصل على التقرير الفعلي الذي تريده.

كل هذا يتوقف على كيفية غالبا ما سوف يكون أداء هذه المهمة بالذات.

يمكن لـ Excel فتح صفحة http.

على سبيل المثال:

  1. انقر فوق ملف مفتوح

  2. تحت اسم الملف ولصق URL أي: كيف يمكن أن أتحصل على جدول HTML إلى CSV ؟

  3. انقر فوق موافق

Excel قصارى جهدها من أجل تحويل html إلى جدول.

ليس الحل الأكثر أناقة ، ولكن لا تعمل!

الأساسية تنفيذ الثعبان باستخدام BeautifulSoup أيضا النظر في كل rowspan و colspan:

from BeautifulSoup import BeautifulSoup

def table2csv(html_txt):
   csvs = []
   soup = BeautifulSoup(html_txt)
   tables = soup.findAll('table')

   for table in tables:
       csv = ''
       rows = table.findAll('tr')
       row_spans = []
       do_ident = False

       for tr in rows:
           cols = tr.findAll(['th','td'])

           for cell in cols:
               colspan = int(cell.get('colspan',1))
               rowspan = int(cell.get('rowspan',1))

               if do_ident:
                   do_ident = False
                   csv += ','*(len(row_spans))

               if rowspan > 1: row_spans.append(rowspan)

               csv += '"{text}"'.format(text=cell.text) + ','*(colspan)

           if row_spans:
               for i in xrange(len(row_spans)-1,-1,-1):
                   row_spans[i] -= 1
                   if row_spans[i] < 1: row_spans.pop()

           do_ident = True if row_spans else False

           csv += '\n'

       csvs.append(csv)
       #print csv

   return '\n\n'.join(csvs)

هنا اختبار المثال الذي يجمع بين grequest و الحساء تحميل كميات كبيرة من الصفحات من منظم الموقع:

#!/usr/bin/python

from bs4 import BeautifulSoup
import sys
import re
import csv
import grequests
import time

def cell_text(cell):
    return " ".join(cell.stripped_strings)

def parse_table(body_html):
    soup = BeautifulSoup(body_html)
    for table in soup.find_all('table'):
        for row in table.find_all('tr'):
            col = map(cell_text, row.find_all(re.compile('t[dh]')))
            print(col)

def process_a_page(response, *args, **kwargs): 
    parse_table(response.content)

def download_a_chunk(k):
    chunk_size = 10 #number of html pages
    x = "http://www.blahblah....com/inclusiones.php?p="
    x2 = "&name=..."
    URLS = [x+str(i)+x2 for i in range(k*chunk_size, k*(chunk_size+1)) ]
    reqs = [grequests.get(url, hooks={'response': process_a_page}) for url in URLS]
    resp = grequests.map(reqs, size=10)

# download slowly so the server does not block you
for k in range(0,500):
    print("downloading chunk ",str(k))
    download_a_chunk(k)
    time.sleep(11)

هل حاولت فتحه مع excel ؟ إذا قمت بحفظ البيانات في excel كـ html سترى تنسيق يستخدم excel.من تطبيق ويب كتبت أنا أبصق تنسيق html بحيث يمكن للمستخدم تصدير إلى excel.

إذا كنت كشط الشاشة و الجدول كنت تحاول تحويل يحتوي على هوية معينة ، يمكنك دائما القيام regex تحليل html جنبا إلى جنب مع بعض البرمجة لتوليد CSV.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top