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

تحليل جدول بمعرّف ID محدد باستخدام BeautifulSoup في بايثون

إياد أحمد

السؤال

كتبت الكود التالي للحصول على البيانات من جدول ب ID  محدد:

from bs4 import BeautifulSoup
hDoc = br.response()
soup = BeautifulSoup(hDoc.read(),'html')
table = soup.find(lambda tag: tag.name=='table' and tag.has_key('id') and tag['id']=="HistoryData1")
rows = table.findAll(lambda tag: tag.name=='tr')

وهذا هو المقطع من كود HTML:

<table cellspacing="0" cellpadding="3" border="0" id="HistoryData1" style="width:100%;border-collapse:collapse;">
    <tr class="gridHeader" valign="top">
        <td class="titleGridRegNoB" align="center" valign="top"><span dir=RTL>ballov</span></td>
        <td class="titleGridReg" align="center" valign="top">Grand</td>
        <td class="titleGridReg" align="center" valign="top">andera</td>
        <td class="titleGridReg" align="center" valign="top">colofisiaky</td>
        <td class="titleGridReg" align="center" valign="top">tochy</td><td class="titleGridReg" align="center" valign="top"><span dir="rtl"> (laesd)</span></td>
        <td class="titleGridReg" align="center" valign="top">שער נעילה מתואם</td><td class="titleGridReg" align="center" valign="top">kagt</td>
    </tr>
    <tr onmouseover="this.style.backgroundColor='#FDF1D7'" onmouseout="this.style.backgroundColor='#ffffff'">

لكن عندما أحاول طباعة الجدول أحصل على None؟

print (table)
# None

 

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

Recommended Posts

  • 0

نظرًا لأنك تعمل باستخدام بيانات UTF-8 ، فأنت بحاجة إلى تعيين السلسلة كسلسلة Unicode أي فقط هكذا:

html=u"""
<table cellspacing="0" cellpadding="3" border="0" id="ctl00_SPWebPartManager1_g_c001c0d9_0cb8_4b0f_b75a_7cc3b6f7d790_ctl00_HistoryData1_gridHistoryData_DataGrid1" style="width:100%;border-collapse:collapse;">
    <tr class="gridHeader" valign="top">
        <td class="titleGridRegNoB" align="center" valign="top"><span dir=RTL>ballov</span></td>
        <td class="titleGridReg" align="center" valign="top">Grand</td>
        <td class="titleGridReg" align="center" valign="top">andera</td>
        <td class="titleGridReg" align="center" valign="top">colofisiaky</td>
        <td class="titleGridReg" align="center" valign="top">tochy</td><td class="titleGridReg" align="center" valign="top"><span dir="rtl"> (laesd)</span></td>
        <td class="titleGridReg" align="center" valign="top">שער נעילה מתואם</td><td class="titleGridReg" align="center" valign="top">kagt</td>
    </tr>
    <tr onmouseover="this.style.backgroundColor='#FDF1D7'" onmouseout="this.style.backgroundColor='#ffffff'">
"""

أيضاً للبحث عن الجدول بالمعرّف المحدد نكتب اسم الوسم ثم اتبعه بالمعرفّ كما يلي:

table = soup.find('table', id="HistoryData1")

وبالنسبة للأسطر فقط استدعي الدالة findall من كائن table وحدد لها الوسم tr

rows = table.findAll('tr')

وبالنسبة للترميز، حاول فك ترميزها من utf-8 ، وأعد ترميزها، كما يلي:

html = br.response().read().decode('utf-8')
soup = BeautifulSoup(html.encode('utf-8'))

 

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

  • 0

بدلًا من إستعمال التابع findAll و التابع find يمكنك أن تستعمل التابع select والتابع select_one للقيام بهذه المهمة، على النحو التالي:

from bs4 import BeautifulSoup
content = """<table cellspacing="0" cellpadding="3" border="0" id="HistoryData1" style="width:100%;border-collapse:collapse;">
    <tr class="gridHeader" valign="top">
        <td class="titleGridRegNoB" align="center" valign="top"><span dir=RTL>ballov</span></td>
        <td class="titleGridReg" align="center" valign="top">Grand</td>
        <td class="titleGridReg" align="center" valign="top">andera</td>
        <td class="titleGridReg" align="center" valign="top">colofisiaky</td>
        <td class="titleGridReg" align="center" valign="top">tochy</td><td class="titleGridReg" align="center" valign="top"><span dir="rtl"> (laesd)</span></td>
        <td class="titleGridReg" align="center" valign="top">שער נעילה מתואם</td><td class="titleGridReg" align="center" valign="top">kagt</td>
    </tr>
    <tr onmouseover="this.style.backgroundColor='#FDF1D7'" onmouseout="this.style.backgroundColor='#ffffff'">
    </tr>
    </table>
"""

soup = BeautifulSoup(content, features='lxml')

table = soup.select_one('table#HistoryData1')
print(table)

rows = table.select('tr')
print(rows)

لاحظ كيف تم إستعمال التابع select_one للحصول على العنصر table الذي يحمل المعرف HistoryData1 ثم تم إستعمال هذا الجدول للبحث عن كل عناصر tr التي يحتويها من خلال التابع select والذي يقوم بإرجاع قائمة من العناصر.

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...