انتقل إلى المحتوى

كيفية تحويل HTML إلى نص في بايثون؟

فيما يلي منشور مدونة يحتوي على أكثر من 2000 كلمة حول "كيفية تحويل HTML إلى نص في Python؟":

يعد HTML تنسيقًا مهمًا لتخزين البيانات وعرضها على الويب. عند تجريف الويب، غالبًا ما نرغب في استخراج محتوى النص المرئي فقط من صفحات HTML. سأستكشف في هذا المنشور تقنيات مختلفة لتحويل HTML إلى نص نظيف في Python.

لماذا تحويل HTML إلى نص؟

هناك بعض الأسباب الرئيسية التي قد تدفعك إلى إزالة علامات HTML واستخراج النص فقط:

  • تبسيط المحتوى المسروق – عند نسخ صفحات الويب، يتضمن HTML عادةً الكثير من العلامات الإضافية والعناصر التي لا نحتاجها مثل روابط التنقل. يؤدي استخراج النص الرئيسي إلى تسهيل تحليل المحتوى والعمل معه.

  • إزالة التنسيق - يطبق HTML التنسيق والتخطيط المرئيين. بالنسبة للعديد من التطبيقات مثل تحليل المشاعر، نريد فقط محتوى النص دون أي تنسيق.

  • تخزينها في شكل نص – قد يكون من المفيد استخراج النص فقط من HTML بحيث يمكن تخزينه بتنسيق بسيط مثل ملف نصي أو في حقل نصي بقاعدة البيانات. يؤدي هذا إلى إزالة كافة علامات HTML الضخمة.

  • قراءة – يصعب على البشر قراءة لغة HTML الخام وتفسيرها. التحويل إلى نص يجعله أكثر قابلية للقراءة.

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

  • فهرسة محرك البحث – تقوم محركات البحث بتحليل وفهرسة المحتوى النصي المرئي للصفحات إلى حد كبير. يمكن أن يساعد تحويل HTML إلى نص في تحليل المحتوى المماثل لكيفية رؤيته لمحركات البحث.

باختصار، يعد استخراج النص من HTML مفيدًا في عملية التجريد والتحليل والتخزين وإمكانية الوصول. تغطي الأقسام التالية طرقًا مختلفة لتحقيق ذلك في بايثون.

تجريد علامات HTML باستخدام BeautifulSoup

Beautiful Soup هي مكتبة بايثون شائعة لتجميع صفحات الويب وتحليل HTML. يمكننا استخدامه لاستخراج النص من HTML بسهولة إلى حد ما.

إن أبسط طريقة هي استدعاء get_text() الطريقة على كائن BeautifulSoup أو عنصر محدد من HTML الذي تم تحليله. على سبيل المثال:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

soup = BeautifulSoup(html, "html.parser")

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

يؤدي هذا إلى إزالة كافة علامات HTML وإرجاع سلسلة تحتوي على النص المرئي.

شيء واحد هو أن نلاحظ ذلك get_text() افتراضيًا، سيتم أيضًا تكثيف عدة أحرف مسافات بيضاء متتالية في مسافة واحدة. يمر strip=False للحفاظ على المسافات البيضاء مثل الأسطر الجديدة والمسافات الإضافية:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

لاستخراج النص من جزء فقط من HTML، اتصل get_text() على عنصر بدلاً من المستند بأكمله:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

تحذير واحد هو أن get_text() سيظل يتضمن أي نص متداخل داخل العناصر الفرعية مثل الروابط. لتجريد هؤلاء أيضًا، قم بتمرير أ recursive=False حجة:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

لذلك مع BeautifulSoup يمكننا استخدامه بسهولة get_text() لاستخراج النص المرئي من HTML.

استخراج النص باستخدام lxml

com.lxml هي مكتبة Python شائعة أخرى لتحليل XML وHTML. يمكننا استخدامه لاستخراج النص كذلك.

من lxml HTMLParser عنصر، استدعاء text_content() طريقة الحصول على النص:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

سيؤدي هذا إلى استخراج كل النص بشكل متكرر بما في ذلك العناصر الفرعية. لاستبعاد النص من الأطفال، قم بتمرير أ children=False حجة:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

لذلك يوفر lxml أيضًا طريقة بسيطة لإزالة HTML والحصول على محتوى النص فقط.

التعبيرات العادية

يمكن أيضًا استخدام النهج المستند إلى regex لإزالة علامات HTML. يتضمن ذلك استخدام نمط لمطابقة جميع علامات HTML والبدائل لاستبدالها بلا شيء:

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

regex r"<[^>]*>" اعواد الثقاب < يتبعه أي شيء باستثناء > مرة أو أكثر، تليها >. re.sub() يؤدي الاتصال إلى إزالة هذه التطابقات، مما يؤدي بشكل فعال إلى إزالة جميع علامات HTML.

للتعامل أيضًا مع مساحات أسماء XML وعلامات الإغلاق الذاتي:

clean = re.sub(r"<[^>]+>", "", html)

يعد هذا أسلوبًا سريعًا وبسيطًا يعتمد على التعبير العادي لإزالة جميع علامات HTML. على الرغم من أنها لا تقدم نفس التحكم والبساطة التي توفرها مكتبات تحليل HTML المحددة مثل BeautifulSoup وlxml.

التعامل مع الترميز

يمكن ترميز صفحات الويب بتنسيقات نصية مختلفة مثل ASCII أو UTF-8 أو ISO-8859-1. عند نسخ الصفحات، نريد اكتشاف التشفير وفك التشفير بشكل صحيح إلى نص Unicode.

chardet يمكن للمكتبة اكتشاف الترميز تلقائيًا لنا:

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

يمكننا بعد ذلك فك تشفير بايتات HTML بشكل صريح إلى سلسلة Unicode قبل تحليل النص واستخراجه.

عند تحويل HTML إلى نص، يجب معالجة الترميز أولاً قبل أي تحليل لتجنب أخطاء الترميز.

HTML الكامل لمثال النص

فيما يلي مثال لتجميع الخطوات الموضحة لاستخراج النص بقوة من HTML:

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

يعالج هذا اكتشاف التشفير وتجريد العلامات واستخراج النص في وظيفة قابلة لإعادة الاستخدام.

هناك أيضًا مكتبات Python مثل نص التي تحتوي على بعض هذه الوظائف لتحويل تنسيقات الملفات المختلفة إلى نص.

تحويل كيانات HTML

هناك مشكلة أخرى قد نواجهها وهي HTML باستخدام كيانات الأحرف مثل   و & بدلاً من الأحرف الحرفية.

يمكننا استخدام html.unescape() وظيفة من معيار بايثون مكتبة أتش تي أم أل لتحويل الكيانات مرة أخرى إلى أحرف:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

يمكن القيام بذلك قبل أو بعد استخراج النص من HTML.

التعامل مع جافا سكريبت

يتمثل أحد قيود التقنيات المذكورة أعلاه في أنها تستخرج فقط النص المرئي من HTML الأولي. لن يتم التقاط أي نص تمت إضافته ديناميكيًا بواسطة JavaScript.

لتنفيذ JavaScript وعرض النص الكامل، نحتاج إلى استخدام متصفح بدون رأس مثل عنصر السيلينيوم or الكاتب المسرحي:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

هنا يتم استخدام Playwright لتحميل الصفحة وتنفيذ JavaScript، مما يسمح لنا باستخراج النص الكامل.

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

نبذة عامة

هناك بعض التقنيات الرئيسية لتحويل HTML إلى نص عادي في بايثون:

  • استعمل get_text() من بيوتيفول سوب
  • استخراج المحتوى مع text_content() في أكسل
  • إزالة العلامات باستخدام التعبيرات العادية
  • قم بفك تشفير أي ترميزات قبل التحليل
  • التعامل مع كيانات HTML مع html.unescape()
  • استخدم متصفحًا بلا رأس إذا كانت هناك حاجة إلى تنفيذ JavaScript

يعد تحويل HTML إلى نص مفيدًا لتبسيط المحتوى المسروق، وتحليل النص بدلاً من الترميز، وتحسين إمكانية القراءة وإمكانية الوصول، والفهرسة بواسطة محركات البحث، والتخزين بتنسيق خفيف الوزن.

آمل أن يكون هذا المنشور قد قدم دليلاً شاملاً للطرق الرئيسية لاستخراج النص من HTML باستخدام بايثون! اسمحوا لي أن أعرف إذا كان لديك أي تقنيات مفيدة أخرى.

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *