يمكنني شريحة وثيقة في BeautifulSoup قبل تحويله إلى النص على أساس تحليلي من هذه الوثيقة؟

StackOverflow https://stackoverflow.com/questions/866772

  •  22-08-2019
  •  | 
  •  

سؤال

ولدي بعض ملفات HTML والتي أريد تحويل إلى النص. لقد لعبت حوالي مع BeautifulSoup وإحراز بعض التقدم على فهم كيفية استخدام التعليمات ويمكن تقديم أتش تي أم أل ونعود النص.

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

<table>
<td> here is some really useful information and there might be other markup tags but
     this information is really textual in my eyes-I want to preserve it
 </td>
</table>

وبعد ذلك هناك "الجداول الكلاسيكية" التي تحتوي على بيانات داخل الجسم من الجدول.

وأريد أن أكون قادرة على تطبيق خوارزمية الى طاولة المفاوضات ووضع بعض القواعد التي تحدد ما إذا كان وقع الجدول من قبل I تحويل المستند إلى نص.

ولقد برزت كيفية الحصول على خصائص tables- بلدي على سبيل المثال للحصول على عدد من الأعمدة في كل جدول:

numbCols=[]
for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
        rows.append(columns)
    numbCols.append(rows)

وحتى أستطيع أن تعمل على numbCols واستخدام ليون من كل عنصر في القائمة والقيم في كل عنصر في القائمة لتحليل خصائص الجداول بلدي وتحديد تلك التي كنت تريد أن تبقي أو تجاهل.

وأنا لا أرى وسيلة أنيقة لاستخدام هذه المعلومات مع BeautifulSoup للحصول على النص. أعتقد أن ما أحاول أن يحصل على ما أفترض تحليل numbCols وتقرر أن الجداول عشرة في وثيقة معينة أريد أن استبعاد الجداول 2 و 4 و 6 و 9. لذلك الجزء من الوثيقة أتش تي أم أل يشمل كل شيء ولكن هذه الجداول. كيف يمكنني شريحة بلدي حساء بهذه الطريقة؟

والحل لقد جئت به هو أولا تحديد موقف كل من العلامات الجدول فتح وإغلاق باستخدام finditer والحصول على فترات ثم فتح سوستة يمتد مع numbCols. أنا يمكن بعد ذلك استخدام هذه القائمة لقص والانضمام إلى قطعة من سلسلة بلدي معا. وبمجرد الانتهاء من هذا يمكنني ثم استخدام BeautifulSoup لتحويل أتش تي أم أل إلى نص.

وأنا على ثقة بأنني يجب أن تكون قادرة على أن تفعل كل هذا في BeautifulSoup. فإن أي اقتراحات أو وصلات إلى أمثلة قائمة تكون كبيرة. أود أن أذكر أن ملفات مصدر بلدي يمكن أن تكون كبيرة ولدي الآلاف في التعامل معها.

لم يكن لديهم الجواب ولكن أنا أقترب

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

المحلول

ورجل أحب هذه الاشياء وإذا افترضنا في حالة السذاجة التي أريد حذف كافة الجداول التي لديها أية صفوف مع طول العمود أكبر من 3 جوابي هو

for table in soup.findAll('table'):
    rows=[]
    for row in table.findAll('tr'):
        columns=0
        for column in row.findAll('td'):
            columns+=1
            rows.append(columns)
        if max(rows)>3:
          table.delete()

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

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