إياد أحمد نشر 23 نوفمبر 2021 أرسل تقرير نشر 23 نوفمبر 2021 (معدل) أحاول استخراج الجدول الموجود في الرابط التالي باستخدام bs4، كيف يمكنني القيام بذلك؟https://en.wikipedia.org/wiki/2019_Ballon_d'Or تم التعديل في 23 نوفمبر 2021 بواسطة إياد أحمد 1 اقتباس
1 Ali Haidar Ahmad نشر 23 نوفمبر 2021 أرسل تقرير نشر 23 نوفمبر 2021 علينا الوصول إلى الموقع ثم تحليل ملف ال HTML من خلال bs4. ثم كخطوة ثانية نذهب إلى الصفحة التي تطلبها، ستجد أن اسم ال class للجدول المطلوب يحمل اسم wikitable كما ويحوي عدة وسوم tr تمثل صفوف الجدول. بحيث أن علامة tr الأولى مخصصة لعناوين الجدول وأن وسوم tr الثانية مخصصة لبيانات الجدول. لذا تابع الكود: ###################################### خطوة 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']] """ 1 اقتباس
0 Ahmed Sharshar نشر 26 نوفمبر 2021 أرسل تقرير نشر 26 نوفمبر 2021 بجانب الطريقة السابقة هناك طريقة أخرى سهلة، وهي الاستفادة من أن الجداول في 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() اقتباس
السؤال
إياد أحمد
أحاول استخراج الجدول الموجود في الرابط التالي باستخدام bs4، كيف يمكنني القيام بذلك؟https://en.wikipedia.org/wiki/2019_Ballon_d'Or
تم التعديل في بواسطة إياد أحمد2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.