اذهب إلى المحتوى
  • 0

كيفية استخراج جدول من موقع ويب باستخدام BeautifulSoup في بايثون

إياد أحمد

السؤال

أحاول استخراج الجدول الموجود في الرابط التالي باستخدام bs4، كيف يمكنني القيام بذلك؟https://en.wikipedia.org/wiki/2019_Ballon_d'Or

تم التعديل في بواسطة إياد أحمد
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

علينا الوصول إلى الموقع ثم تحليل ملف ال HTML من خلال bs4. ثم كخطوة ثانية نذهب إلى الصفحة التي تطلبها، ستجد أن اسم ال class للجدول المطلوب يحمل اسم wikitable كما ويحوي عدة وسوم tr تمثل صفوف الجدول. بحيث أن علامة tr الأولى مخصصة لعناوين الجدول وأن وسوم tr الثانية مخصصة لبيانات الجدول.
1.thumb.png.1d499e8eea46f21d30da2e0b312f6635.png
لذا تابع الكود:

###################################### خطوة 1#####################################
# استيراد الوحدات اللازمة
from bs4 import BeautifulSoup
import requests
# تحديد الموقع الهدف
URL = "https://en.wikipedia.org/wiki/2019_Ballon_d%27Or"
# والحصول على كائن الاستجابة URL طلب عنوان 
responseObj = requests.get(URL)
# BeautifulSoup تحليل النص الذي تم الحصول عليه من خلال 
soup = BeautifulSoup(responseObj.text, 'lxml')
# للأعمدة td يستخدم لإنشاء صفوف الجدول والوسم  tr تذكر أن الوسم
###################################### خطوة 2#####################################
# class وتحديد اسم ال find الآن سنقوم بالإمساك بالجدول من خلال استخدام الدالة 
gdp_table = soup.find("table", attrs={"class": "wikitable"})
# سنقوم بالامساك كل الصفوف المكون منها هذا الجدول
gdp_table_data = gdp_table.tbody.find_all("tr")
# إنشاء قائمة لوضع أسماء الأعمدة فيها
headings = []
for th in gdp_table_data[0].find_all("th"):
    # أزل أي أسطر جديدة ومسافات زائدة من اليسار واليمين
    headings.append(th.text.replace('\n', ' ').strip())
# طباعتها
print(headings)
# ['Rank', 'Player', 'Club(s)', 'Points']
###################################### خطوة3 #####################################
# إنشاء قائمة لنضع فيها البيانات
table_data=[]
# الإمساك بكل الصفوف عدة الصف الأول الذي يمثل العناوين
for tr in gdp_table_data[1:]:
    # سنضع هنا بيانات كل سطر على حدى ثم سنضيفه للقائمة الأساسية
    row=[]
    for td in tr.find_all("td"):
      # أزل أي أسطر جديدة ومسافات زائدة من اليسار واليمين      
       row.append(td.text.replace('\n', ' ').strip())     
    table_data.append(row)
# طباعة بعض من بيانات الجدول
print(table_data[0:3])
"""
[['1', 'Lionel Messi', 'Barcelona', '686'],
 ['2', 'Virgil van Dijk', 'Liverpool', '679'],
 ['3', 'Cristiano Ronaldo', 'Juventus', '476']]
"""

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بجانب الطريقة السابقة هناك طريقة أخرى سهلة، وهي الاستفادة من أن الجداول في html يتم تعريفها بوسم table وبذلك نستطيع الحصول عليها بسهولة كالتالي:

# استدعاء المكتبات
import requests
import pandas as pd
from bs4 import BeautifulSoup

# تحميل المحتوى من صفحة
url = "https://pt.wikipedia.org/wiki/Lista_de_bairros_de_Manaus"
data = requests.get(url).text

# تحويله الى html object
soup = BeautifulSoup(data, 'html.parser')

# طباعة الجداول
print('Classes of each table:')
for table in soup.find_all('table'):
    print(table.get('class'))

ويكون الخرج كالتالي:

OUTPUT:
Classes of each table:
['box-Desatualizado', 'plainlinks', 'metadata', 'ambox', 'ambox-content']
['wikitable', 'sortable']
['nowraplinks', 'collapsible', 'collapsed', 'navbox-inner']

بعد ذلك نستطيع الحصول على جدول بعينه كالتالي:

# عمل قائمة بالجداول
tables = soup.find_all('table')

#  البحث عن الجدول 'wikitable' و 'sortable'
table = soup.find('table', class_='wikitable sortable')

بعد ذلك نستطيع تحويل تلك الجداول الى dataframe كالتالي:

# تعريف ال dataframe
df = pd.DataFrame(columns=['Neighborhood', 'Zone', 'Area', 'Population', 'Density', 'Homes_count'])

# تجميع البيانات
for row in table.tbody.find_all('tr'):    
    # الحصول على بيانات كل عمود
    columns = row.find_all('td')
    
    if(columns != []):
        neighborhood = columns[0].text.strip()
        zone = columns[1].text.strip()
        area = columns[2].span.contents[0].strip('&0.')
        population = columns[3].span.contents[0].strip('&0.')
        density = columns[4].span.contents[0].strip('&0.')
        homes_count = columns[5].span.contents[0].strip('&0.')

        df = df.append({'Neighborhood': neighborhood,  'Zone': zone, 'Area': area, 'Population': population, 'Density': density, 'Homes_count': homes_count}, ignore_index=True)

ويكون الناتج النهائي كالتالي:

df.head()

1_rkuf8KEfixdwDTx2X9BfWQ.png.9a81c4035f05193a062ee370aba3ee03.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...