وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

خواندن و نوشتن جداول HTML با پانداها

0 17
زمان لازم برای مطالعه: 6 دقیقه


معرفی

زبان نشانه گذاری فرامتن (HTML) زبان نشانه گذاری استاندارد برای ساخت صفحات وب است. ما می توانیم داده های جدولی را با استفاده از HTML ارائه دهیم <table> عنصر کتابخانه تجزیه و تحلیل داده پانداها عملکردهایی مانند این را ارائه می دهد read_html() و to_html() بنابراین ما می توانیم import و export داده ها به DataFrames

در این مقاله، روش خواندن داده های جدولی از یک فایل HTML و بارگذاری آن در Pandas DataFrame را خواهیم آموخت. همچنین روش نوشتن داده ها از Pandas DataFrame و فایل HTML را یاد خواهیم گرفت.

توجه داشته باشید: در این مقاله به خواندن و نوشتن HTML می پردازیم <table> عناصر. این مقاله شامل تجزیه کل فایل HTML نیست.

خواندن HTML

ما می توانیم جداول یک فایل HTML را با استفاده از read_html() تابع. این تابع جداول فایل های HTML را به صورت Pandas DataFrames می خواند. می توان آن را از یک فایل یا یک URL خواند.

بیایید یک به یک به هر منبع ورودی نگاهی بیندازیم.

خواندن داده های HTML از یک فایل

برای این بخش، از یک مجموعه داده ورودی استفاده خواهیم کرد. یک جدول شامل زبان های برنامه نویسی و سال ایجاد آنها است. جدول دیگر اندازه زمین و هزینه آنها به دلار است.

محتوای HTML زیر را در فایلی به نام ذخیره کنید table_data.html:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Table Data</title>
</head>

<body>
  <table>
    <thead>
      <tr>
        <th>Programming Language</th>
        <th>Creator</th>
        <th>Year</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>C</td>
        <td>Dennis Ritchie</td>
        <td>1972</td>
      </tr>
      <tr>
        <td>Python</td>
        <td>Guido Van Rossum</td>
        <td>1989</td>
      </tr>
      <tr>
        <td>Ruby</td>
        <td>Yukihiro Matsumoto</td>
        <td>1995</td>
      </tr>
    </tbody>
  </table>
  <table>
    <thead>
      <tr>
        <th>
          Area (sq.ft)
        </th>
        <th>
          Price (USD)
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>
          12000
        </td>
        <td>
          500
        </td>
      </tr>
      <tr>
        <td>
          32000
        </td>
        <td>
          700
        </td>
      </tr>

    </tbody>
  </table>
</body>

</html>

پانداها به کمک کتابخانه دیگری به نام نیاز دارند lxml برای تجزیه فایل های HTML و XML. برای read_html() تابع برای کار شما باید نصب کنید lxml:

$ pip install lxml

یک بار lmxl نصب شده است، ما می توانیم استفاده کنیم read_html() تابع. فهرستی از DataFrame ها را برمی گرداند که در آن هر DataFrame یک عنصر جدول کامل از فایل HTML داده شده است. ما با فهرست کردن لیست به هر جدول به عنوان یک DataFrame دسترسی داریم.

کد زیر استفاده از read_html() تابع خواندن جداول از فایل HTML:

import pandas as pd

tables = pd.read_html('table_data.html')
print('Tables found:', len(tables))
df1 = tables(0)  
df2 = tables(1)  

print('First Table')
print(df1)
print('Another Table')
print(df2)

توجه داشته باشید: در حالی که شما نیاز دارید lxml نصب شده است، نیازی به آن ندارید import آن را در برنامه شما برای پانداها به کار.

اجرای کد بالا روی یک مفسر پایتون خروجی زیر را تولید می کند:

Tables found: 2
First Table
  Programming Language             Creator  Year
0                    C      Dennis Ritchie  1972
1               Python    Guido Van Rossum  1989
2                 Ruby  Yukihiro Matsumoto  1995
Another Table
   Area (sq.ft)  Price (USD)
0         12000          500
1         32000          700

خواندن داده های HTML از URL

همانطور که عناصر جدول را از یک فایل HTML می خوانیم، می توانیم عناصر جدول را از وب HTML نیز بخوانیم page به یک DataFrame با read_html(). با این حال، به جای نام فایل، یک URL مانند این ارائه می دهیم:

read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')

و لیستی از DataFrame ها را برمی گرداند که در آن هر DataFrame یک عنصر جدول را از URL داده شده نشان می دهد.

در اینجا یک کد مثال برای خواندن عناصر جدول از URL وب سایت با استفاده از Pandas آمده است:

import pandas as pd

tables = pd.read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
print('Tables found:', len(tables))
df1 = tables(0)  
print('First Table')
print(df1.head())  

اگر کد بالا را با موفقیت اجرا کنیم، می توانیم خروجی را به صورت زیر ببینیم:

Tables found: 10
First Table
                0                                                  1
0             NaN                                                NaN
1        Paradigm  Multi-paradigm: functional, imperative, object...
2     Designed by                                   Guido van Rossum
3       Developer                         Python Software Foundation
4  First appeared                              1991; 29 years ago(1)

خواندن داده های HTML از URL که نیاز به احراز هویت دارد

ما می دانیم که می توانیم عناصر جدول را از یک وب سایت بخوانیم. با این حال، زمانی که سایت نیاز به احراز هویت دارد، کد به استثنای زیر اجرا می شود:

raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: UNAUTHORIZED

برای خواندن داده‌ها از این آدرس‌ها، از آن استفاده می‌کنیم requests مدول. می توانید با آن نصب کنید pip:

$ pip install requests

حال از آن استفاده خواهیم کرد get() روش از requests کتابخانه برای درخواست یک URL وب سایت در حالی که اختیاری را ارائه می دهد auth پارامتر اگر سایت نیاز به احراز هویت داشته باشد.

این روش یک شی پاسخ را از وب برمی گرداند page. می‌توانیم کد وضعیت را بررسی کنیم (برای اینکه مطمئن شویم محتوا قطعاً وجود دارد) و متن را از شی پاسخ دریافت کنیم و سپس جدول را به DataFrame تبدیل کنیم.

بیایید نمونه ای از استفاده را ببینیم requests برای دریافت داده هایی که نیاز به احراز هویت دارند. برای این منظور استفاده می کنیم httpbin.org:

import requests

r = requests.get('https://httpbin.org/basic-auth/john/johnspassword', auth=('john', 'johnspassword'))

print(r.status_code)
print(r.text)

با اجرای کد بالا، خروجی زیر را مشاهده می کنیم:

200
{
  "authenticated": true, 
  "user": "john"
}

این نشان می دهد که ما با موفقیت به وب دسترسی پیدا کرده ایم page محتوای یک URL تأیید شده با این حال، این وب سایت فقط حاوی داده های JSON است و ما به عناصر جدول HTML به عنوان DataFrames نیاز داریم.

بیایید به URL قبلی بچسبیم و استفاده کنیم requests برای خواندن جداول HTML به عنوان DataFrames. در حالی که سایت قبلی عمومی بود، مراحل دسترسی به محتوای تایید شده یکسان است.

پس از دریافت پاسخ، می توانیم از آن عبور کنیم r.text به read_html() روش. و طبق معمول، لیستی از جداول آن را به عنوان DataFrames دریافت خواهیم کرد:

import pandas as pd
import requests


r = requests.get('https://en.wikipedia.org/wiki/Python_(programming_language)',
                 auth=('john', 'johnspassword'))
tables = pd.read_html(r.text)
print('Tables found:', len(tables))
df1 = tables(0)
print('First Table')
print(df1.head())

با اجرای این کد خروجی زیر تولید می شود:

Tables found: 10
First Table
                0                                                  1
0             NaN                                                NaN
1        Paradigm  Multi-paradigm: functional, imperative, object...
2     Designed by                                   Guido van Rossum
3       Developer                         Python Software Foundation
4  First appeared                              1991; 29 years ago(1)

نوشتن جداول HTML با پانداهای پایتون

ما با موفقیت داده ها را از جداول HTML خوانده ایم. بیایید Pandas DataFrame را در یک فایل HTML بنویسیم. این را می توان با استفاده از to_html() روش.

این to_html() مسیر فایلی را می‌گیرد که می‌خواهید داده‌ها به آن صادر شوند. اگر یک مسیر مطلق ارائه نکنید، یک فایل نسبت به دایرکتوری فعلی ذخیره می شود.

تو می توانی export یک DataFrame به یک جدول HTML مانند این:

import pandas as pd

df = pd.DataFrame({'A': (1, 2), 'B': (3, 4)})
df.to_html('write_html.html')

این کد فایل زیر را تولید می کند write_html.html در دایرکتوری فعلی:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

توجه داشته باشید که export یک سند کامل HTML نیست، بلکه فقط خود جدول HTML است.

نوشتن جداول HTML استایل شده با پانداهای پایتون

همانطور که می بینیم، به طور پیش فرض حاشیه جدول 1 است، تراز درست است، و همچنین دارای شاخص های DataFrame در <th> برچسب ها ما می توانیم این ساختار پیش فرض را با ارائه چند پارامتر اختیاری تغییر دهیم.

پنهان کردن فهرست

اگر نمی خواهیم شاخص را در خروجی جدول قرار دهیم، می توانیم تنظیم کنیم index=False در to_html():

import pandas as pd

df = pd.DataFrame({'A': (1, 2), 'B': (3, 4)})
df.to_html('write_html.html', index=False)

این کد تولید می کند write_html.html فایل با محتوای زیر:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

تغییر حاشیه جدول

حاشیه جدول پیش فرض 1 پیکسل است. برای تغییر این پیش فرض، می توانیم تنظیم کنیم border پارامتر به یک مقدار بر حسب پیکسل.

کد زیر حاشیه را به 3 پیکسل تغییر می دهد:

import pandas as pd

df = pd.DataFrame({'A': (1, 2), 'B': (3, 4)})
df.to_html('write_html.html', border=3)

فایل تولید شده اکنون ویژگی حاشیه جدول را روی “3” تنظیم می کند:

<table border="3" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

متن را توجیه کنید

به طور پیش فرض، متن سر جدول به صورت راست تراز شده است. ما این تراز را با justify پارامتر. مثلا انجام دادن justify="center" اضافه خواهد کرد style="text-align: center;" در <tr> برچسب از <thead> برچسب زدن

بیایید سعی کنیم متن اصلی را در مرکز تراز کنیم و نتایج را ببینیم:

import pandas as pd

df = pd.DataFrame({'A': (1, 'AAA'), 'B': ('BBB', 4)})
df.to_html('write_html.html', justify='center')

جدول ایجاد شده توسط کد بالا به شکل زیر است:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: center;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>BBB</td>
    </tr>
    <tr>
      <th>1</th>
      <td>AAA</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

اکنون متن سر جدول به زیبایی در مرکز قرار گرفته است.

نتیجه

در این آموزش یاد گرفتیم که چطور import و export داده های جدول HTML با Pandas DataFrames. ما داده های جدول HTML را از فایل ها و همچنین از وب بارگیری کردیم page URL ها در مورد URL های تایید شده، ما از ماژول درخواست ها برای احراز هویت و بازیابی داده های سایت استفاده می کنیم و سپس متن پاسخ را به آدرس ارسال می کنیم. read_html() تابع.

ما همچنین یک Pandas DataFrame را به عنوان یک فایل HTML با استفاده از to_html() تابع. سپس جدول تولید شده را با ارسال چند پارامتر اختیاری مانند استایل بندی کردیم index، border و justify. این کار نوشتن داده های DataFrame را به صورت نمایشی آسان می کند.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-13 14:09:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید