سؤال

أرغب في البحث في ملف Word 2007 (.docx) عن سلسلة نصية، على سبيل المثال، "بعض العبارات الخاصة" التي يمكن/يمكن العثور عليها من خلال البحث داخل Word.

هل هناك طريقة من بايثون لرؤية النص؟ليس لدي أي اهتمام بالتنسيق - أريد فقط تصنيف المستندات على أنها تحتوي على "عبارات خاصة" أو لا تحتوي عليها.

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

المحلول

وبشكل أكثر دقة، فإن مستند .docx هو أرشيف مضغوط بتنسيق OpenXML:عليك أولاً فك ضغطه.
لقد قمت بتنزيل عينة (جوجل: بعض أنواع ملفات مصطلح البحث:docx) وبعد فك الضغط وجدت بعض المجلدات.ال كلمة يحتوي المجلد على المستند نفسه، في ملف document.xml.

نصائح أخرى

بعد قراءة رسالتك أعلاه، قمت بإنشاء وحدة Python docx أصلية بنسبة 100% لحل هذه المشكلة تحديدًا.

# Import the module
from docx import *

# Open the .docx file
document = opendocx('A document.docx')

# Search returns true if found    
search(document,'your search string')

وحدة docx موجودة في https://python-docx.readthedocs.org/en/latest/

في هذا المثال، "Course Outline.docx" هو مستند Word 2007، والذي يحتوي على الكلمة "Windows"، ولا يحتوي على العبارة "سلسلة أخرى عشوائية".

>>> import zipfile
>>> z = zipfile.ZipFile("Course Outline.docx")
>>> "Windows" in z.read("word/document.xml")
True
>>> "random other string" in z.read("word/document.xml")
False
>>> z.close()

في الأساس، ما عليك سوى فتح ملف docx (وهو أرشيف مضغوط) باستخدام ملف مضغوط, ، وابحث عن المحتوى في ملف "document.xml" في مجلد "word".إذا أردت أن تكون أكثر تطورًا، يمكنك ذلك تحليل ملف XML, ، ولكن إذا كنت تبحث فقط عن عبارة (والتي تعلم أنها لن تكون علامة)، فيمكنك فقط البحث في ملف XML عن السلسلة.

تتمثل مشكلة البحث داخل ملف XML لمستند Word في إمكانية تقسيم النص إلى عناصر بأي حرف.سيتم تقسيمه بالتأكيد إذا كان التنسيق مختلفًا، على سبيل المثال كما في Hello عالم.لكنه يستطيع يمكن تقسيمها في أي وقت وهذا صالح في OOXML.لذلك سينتهي بك الأمر بالتعامل مع XML بهذه الطريقة حتى لو لم يتغير التنسيق في منتصف العبارة!

<w:p w:rsidR="00C07F31" w:rsidRDefault="003F6D7A">

<w:r w:rsidRPr="003F6D7A">

<w:rPr>

<w:b /> 

</w:rPr>

<w:t>Hello</w:t> 

</w:r>

<w:r>

<w:t xml:space="preserve">World.</w:t> 

</w:r>

</w:p>

يمكنك بالطبع تحميله في شجرة XML DOM (لست متأكدًا مما سيكون عليه في Python) واطلب الحصول على نص كسلسلة فقط، ولكن قد ينتهي بك الأمر مع العديد من "الطرق المسدودة" الأخرى فقط لأن مواصفات OOXML موجودة يبلغ طوله 6000 صفحة ويستطيع برنامج MS Word كتابة الكثير من "الأشياء" التي لا تتوقعها.لذلك قد ينتهي بك الأمر إلى كتابة مكتبة معالجة المستندات الخاصة بك.

أو يمكنك محاولة استخدام Aspose.Words.

وهي متوفرة كمنتجات .NET وJava.يمكن استخدام كلاهما من بايثون.واحد عبر COM Interop والآخر عبر JPype.راجع دليل مبرمجي Aspose.Words، استخدم Aspose.Words في لغات البرمجة الأخرى (آسف لأنني لا أستطيع نشر رابط ثانٍ، لا يسمح لي Stackoverflow بذلك بعد).

يعد docx مجرد أرشيف مضغوط يحتوي على الكثير من الملفات بداخله.ربما يمكنك إلقاء نظرة على بعض محتويات تلك الملفات؟بخلاف ذلك، ربما يتعين عليك العثور على lib يفهم تنسيق الكلمات حتى تتمكن من تصفية الأشياء التي لا تهمك.

الخيار الثاني هو التفاعل مع الكلمة وإجراء البحث من خلالها.

يمكنك استخدام docx2txt للحصول على النص داخل ملف docx، بدلاً من البحث في ملف txt هذا

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout

ملف docx هو في الأساس ملف مضغوط يحتوي على ملف xml بداخله.
يحتوي ملف XML على التنسيق ولكنه يحتوي أيضًا على النص.

من المحتمل أن تكون أتمتة OLE هي الأسهل.عليك أن تفكر في التنسيق، لأن النص قد يبدو بهذا الشكل في ملف XML:

<b>Looking <i>for</i> this <u>phrase</u>

لا توجد طريقة سهلة للعثور على ذلك باستخدام مسح نصي بسيط.

يجب أن تكون قادرًا على استخدام واجهة MSWord ActiveX لاستخراج النص للبحث (أو ربما إجراء البحث).ليس لدي أي فكرة عن كيفية الوصول إلى ActiveX من Python بالرغم من ذلك.

قد تفكر أيضًا في استخدام المكتبة من OpenXMLDeveloper.org

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