From 78ad2171415192b4d617eee710426112eb76c223 Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sat, 3 Oct 2026 02:15:31 +0000 Subject: [PATCH 1/4] Mark html/net/how-to-save-html-as-zip-with-aspose-html-and-include-images as processed --- ...ave-html-as-zip-with-aspose-html-and-include-images.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .processed/html/net/how-to-save-html-as-zip-with-aspose-html-and-include-images.txt diff --git a/.processed/html/net/how-to-save-html-as-zip-with-aspose-html-and-include-images.txt b/.processed/html/net/how-to-save-html-as-zip-with-aspose-html-and-include-images.txt new file mode 100644 index 0000000000..56c217ef87 --- /dev/null +++ b/.processed/html/net/how-to-save-html-as-zip-with-aspose-html-and-include-images.txt @@ -0,0 +1,7 @@ +Title: How to save HTML as zip with Aspose.HTML and include images +Slug: how-to-save-html-as-zip-with-aspose-html-and-include-images +Category: html-extensions-and-conversions +ProcessedDate: 2026-10-03T02:15:29.796159 +SourceRepo: AI Search API +Keywords: save html as zip, how to save html with images +PRNumber: 285 From d1f9f0964dada83d1a1efe968d0cc5852d345f1c Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sat, 3 Oct 2026 02:15:35 +0000 Subject: [PATCH 2/4] Mark html/net/how-to-use-aspose-to-render-html-to-png-image-in-c as processed --- .../how-to-use-aspose-to-render-html-to-png-image-in-c.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .processed/html/net/how-to-use-aspose-to-render-html-to-png-image-in-c.txt diff --git a/.processed/html/net/how-to-use-aspose-to-render-html-to-png-image-in-c.txt b/.processed/html/net/how-to-use-aspose-to-render-html-to-png-image-in-c.txt new file mode 100644 index 0000000000..1177213910 --- /dev/null +++ b/.processed/html/net/how-to-use-aspose-to-render-html-to-png-image-in-c.txt @@ -0,0 +1,7 @@ +Title: How to use Aspose to render HTML to PNG image in C# +Slug: how-to-use-aspose-to-render-html-to-png-image-in-c +Category: rendering-html-documents +ProcessedDate: 2026-10-03T02:15:33.804209 +SourceRepo: AI Search API +Keywords: how to use aspose, render html to image, convert html to png, render html as image, save html as png +PRNumber: 285 From 4c14907b0c1f4c16e5f947b9fc2f1f322d697bbc Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sat, 3 Oct 2026 02:21:35 +0000 Subject: [PATCH 3/4] Mark html/java/how-to-create-pdf-from-html-in-java-step-by-step-guide as processed --- ...-to-create-pdf-from-html-in-java-step-by-step-guide.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .processed/html/java/how-to-create-pdf-from-html-in-java-step-by-step-guide.txt diff --git a/.processed/html/java/how-to-create-pdf-from-html-in-java-step-by-step-guide.txt b/.processed/html/java/how-to-create-pdf-from-html-in-java-step-by-step-guide.txt new file mode 100644 index 0000000000..dc1aede94a --- /dev/null +++ b/.processed/html/java/how-to-create-pdf-from-html-in-java-step-by-step-guide.txt @@ -0,0 +1,7 @@ +Title: How to create pdf from html in Java – step‑by‑step guide +Slug: how-to-create-pdf-from-html-in-java-step-by-step-guide +Category: conversion-html-to-other-formats +ProcessedDate: 2026-10-03T02:21:34.205674 +SourceRepo: AI Search API +Keywords: create pdf from html, convert html to pdf, how to convert html to pdf, html to pdf conversion java, convert html file to pdf +PRNumber: 286 From 382f5f62665585f5efffeea6892ec52b1b30c968 Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sat, 3 Oct 2026 02:29:20 +0000 Subject: [PATCH 4/4] Add 3 html python tutorials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Categories: general Source: AI Search API Tutorials: - How to convert HTML to Markdown in Python – step‑by‑step guide - How to load html document with streaming in Python - How to create SVG document and export it as an image in Python Auto-generated by Professionalize.Tutorials Agent --- .../_index.md | 247 +++++++++++++++++ .../_index.md | 214 +++++++++++++++ .../_index.md | 236 +++++++++++++++++ .../_index.md | 246 +++++++++++++++++ .../_index.md | 213 +++++++++++++++ .../_index.md | 238 +++++++++++++++++ .../_index.md | 245 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 239 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 213 +++++++++++++++ .../_index.md | 236 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../og-image.png | Bin 0 -> 44296 bytes .../_index.md | 216 +++++++++++++++ .../og-image.png | Bin 0 -> 53135 bytes .../_index.md | 240 +++++++++++++++++ .../og-image.png | Bin 0 -> 45043 bytes .../_index.md | 247 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 240 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 246 +++++++++++++++++ .../_index.md | 210 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 249 ++++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 217 +++++++++++++++ .../_index.md | 238 +++++++++++++++++ .../_index.md | 246 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 245 +++++++++++++++++ .../_index.md | 212 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 216 +++++++++++++++ .../_index.md | 238 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 240 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 213 +++++++++++++++ .../_index.md | 236 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 239 +++++++++++++++++ .../_index.md | 248 +++++++++++++++++ .../_index.md | 210 +++++++++++++++ .../_index.md | 236 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 214 +++++++++++++++ .../_index.md | 236 +++++++++++++++++ .../_index.md | 247 +++++++++++++++++ .../_index.md | 215 +++++++++++++++ .../_index.md | 237 +++++++++++++++++ .../_index.md | 249 ++++++++++++++++++ .../_index.md | 211 +++++++++++++++ .../_index.md | 239 +++++++++++++++++ 72 files changed, 16072 insertions(+) create mode 100644 html/arabic/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/arabic/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/arabic/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/chinese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/chinese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/chinese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/czech/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/czech/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/czech/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/dutch/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/dutch/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/dutch/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/og-image.png create mode 100644 html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/og-image.png create mode 100644 html/english/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/english/python/general/how-to-load-html-document-with-streaming-in-python/og-image.png create mode 100644 html/french/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/french/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/french/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/german/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/german/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/german/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/greek/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/greek/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/greek/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/hindi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/hindi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/hindi/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/hongkong/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/hongkong/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/hongkong/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/hungarian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/hungarian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/hungarian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/indonesian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/indonesian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/indonesian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/italian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/italian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/italian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/japanese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/japanese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/japanese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/korean/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/korean/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/korean/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/polish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/polish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/polish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/portuguese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/portuguese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/portuguese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/russian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/russian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/russian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/spanish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/spanish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/spanish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/swedish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/swedish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/swedish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/thai/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/thai/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/thai/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/turkish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/turkish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/turkish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md create mode 100644 html/vietnamese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md create mode 100644 html/vietnamese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md create mode 100644 html/vietnamese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md diff --git a/html/arabic/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/arabic/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..788019dd32 --- /dev/null +++ b/html/arabic/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: تحويل HTML إلى Markdown في بايثون مع مثال كامل. تعلم كيفية حفظ HTML كـ + Markdown، اختيار المُنسّقات، وتمكين الميزات المحددة. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: ar +lastmod: 2026-10-02 +og_description: تحويل HTML إلى Markdown في بايثون باستخدام كود عملي، خيارات التنسيق، + وعلامات الميزات. اتبع هذا الدليل لحفظ HTML كـ Markdown بسرعة. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: تحويل HTML إلى Markdown في بايثون – دليل كامل +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: كيفية تحويل HTML إلى Markdown في بايثون – دليل خطوة بخطوة +url: /ar/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تحويل HTML إلى Markdown في بايثون – دليل خطوة بخطوة + +إذا كنت بحاجة إلى **تحويل HTML إلى Markdown**، يوضح لك هذا الدليل حلاً كاملاً وقابلاً للتنفيذ في بايثون. ستتعرف على كيفية **حفظ HTML كـ Markdown**، اختيار المُنسيق المناسب، وتفعيل الميزات التي تهمك فقط. + +تحويل HTML إلى Markdown مهمة شائعة عندما تريد توثيقًا خفيفًا، محتوى موقع ثابت، أو ملفات نصية مُدارة بالإصدار. يغطي هذا الشرح كل شيء من تثبيت المكتبة إلى التعامل مع الحالات الخاصة، بحيث يمكنك تطبيق التقنية على أي مصدر HTML. + +## المتطلبات المسبقة + +قبل أن تبدأ، تأكد من وجود ما يلي: + +* Python 3.8 أو أحدث مثبت. +* إمكانية الوصول إلى `pip` لتثبيت الحزم الخارجية. +* إلمام أساسي بعلامات HTML وصياغة Markdown. + +لا توجد تبعيات نظام إضافية مطلوبة لأن مكتبة التحويل مكتوبة بالكامل بلغة بايثون. + +## تثبيت مكتبة GroupDocs Conversion + +يستخدم مثال الشيفرة حزمة بايثون **GroupDocs.Conversion**، التي توفر `HTMLDocument` و `MarkdownSaveOptions` و `Converter`. قم بتثبيتها باستخدام: + +```bash +pip install groupdocs-conversion +``` + +> **نصيحة احترافية:** استخدم بيئة افتراضية (`python -m venv venv`) لعزل الحزمة عن المشاريع الأخرى. + +## الخطوة 1: إنشاء `HTMLDocument` من سلسلة نصية + +الخطوة الأولى هي تغليف الـ HTML الخام في كائن `HTMLDocument`. هذا الكائن يج abstracts المصدر، سواء كان من سلسلة نصية، ملف، أو عنوان URL بعيد. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*لماذا هذا مهم:* يقوم `HTMLDocument` بتحليل العلامات مرة واحدة، مما يسمح للمحول بالعمل على تمثيل موحد بدلاً من النص الخام. + +## الخطوة 2: تكوين `MarkdownSaveOptions` + +يتيح لك `MarkdownSaveOptions` التحكم في تنسيق الإخراج وأي ميزات من Markdown يتم إنتاجها. تدعم المكتبة مُنسقين: + +* **DEFAULT** – Markdown متوافق مع CommonMark القياسي. +* **GIT** – Markdown بنكهة Git (يضيف الجداول، الشطب، إلخ). + +في معظم سيناريوهات التحكم بالإصدار، يُفضَّل مُنسق **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### تفعيل الميزات المطلوبة فقط + +يمكنك ضبط الإخراج بدقة عبر تشغيل علامات ميزات محددة. في هذا المثال نحتفظ بـ **الروابط** و **الفقرات** مع تعطيل الصور، الجداول، وغيرها من البُنى. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*لماذا هذا مهم:* تقليل الميزات يقلل من حجم الملف الناتج ويمنع ظهور عناصر Markdown غير متوقعة قد لا تدعمها الأدوات اللاحقة. + +## الخطوة 3: تحويل المستند + +مع `HTMLDocument` المصدر و `MarkdownSaveOptions` المُكوَّنة، يكون التحويل نداءً واحدًا إلى `Converter.convert`. قدم مسارًا مطلقًا أو نسبيًا لملف الإخراج. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +بعد انتهاء العملية، يحتوي `output.md` على تمثيل Markdown للـ HTML الأصلي. + +## السكريبت الكامل الذي يمكنك تشغيله اليوم + +فيما يلي السكريبت المتكامل المستقل الذي يدمج جميع الخطوات السابقة. احفظه باسم `html_to_md.py` وشغّله باستخدام `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### النتيجة المتوقعة (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +يتطابق الناتج مع بنية HTML الأصلية مع إظهار فقط الميزات التي فعلناها (الروابط، الفقرات، والقوائم). + +## التعامل مع الحالات الشائعة + +### خصائص `href` المفقودة أو غير الصالحة + +إذا كان وسم `` يفتقر إلى `href` صالح، يضيف المحول نص الرابط دون عنوان URL. للحفاظ على قابلية القراءة، قد ترغب في معالجة Markdown بعد التحويل: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### تحويل ملفات HTML الكبيرة + +لملفات HTML متعددة الميغابايت، قم ببث الإدخال لتجنب تحميل كامل العلامات في الذاكرة: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +تظل عملية التحويل نفسها دون تغيير لأن `HTMLDocument` يتعامل مع حجم المصدر بصورة مجردة. + +## مُنسقون بديلان + +إذا كنت تفضّل CommonMark العادي بدلاً من الإخراج بنكهة Git، غيّر المُنسق: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +سينتج عن ذلك ملف Markdown أكثر بساطة، مفيد عندما تستهدف منصات لا تدعم امتدادات Git. + +## مهام ذات صلة قد تستكشفها لاحقًا + +* **تحويل Markdown إلى HTML** – مفيد لمعاينة الوثائق. +* **تصدير HTML إلى PDF** – سير عمل شائع آخر مرتبط بـ **html to markdown conversion**. +* **معالجة مجموعة من ملفات HTML دفعة واحدة** – تكرار عبر الملفات وإعادة استخدام نفس كائن `MarkdownSaveOptions`. + +جميع هذه المهام تتبع النمط نفسه: إنشاء مستند مصدر، تكوين خيارات الحفظ، ثم استدعاء `Converter.convert`. + +## الخلاصة + +أنت الآن تعرف كيفية **تحويل HTML إلى Markdown** في بايثون، وكيفية **حفظ HTML كـ Markdown** مع تحكم دقيق في الميزات، ولماذا اختيار المُنسق المناسب مهم للأدوات اللاحقة. يوضح المثال نهجًا نظيفًا وقابلًا لإعادة الاستخدام يعمل مع سلاسل نصية، ملفات، أو عناوين URL، ويتضمن نصائح للتعامل مع الروابط المفقودة والمدخلات الكبيرة. + +لا تتردد في تجربة ميزات إضافية في `MarkdownSaveOptions.Features` (مثل `IMAGE`، `TABLE`) لتخصيص الناتج وفقًا لاحتياجات مشروعك. إذا وجدت هذا الدليل مفيدًا، شاركه مع زملائك أو اربطه في وثائق مشروعك. تحويل سعيد! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/arabic/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..760b062015 --- /dev/null +++ b/html/arabic/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,214 @@ +--- +category: general +date: 2026-10-02 +description: تعلم كيفية إنشاء مستند SVG في بايثون، حفظ SVG إلى ملف، وتصدير صورة SVG + باستخدام سكريبت قصير وكامل. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: ar +lastmod: 2026-10-02 +og_description: أنشئ مستند SVG في بايثون وصدر صورة SVG باستخدام هذا الدرس العملي. + اتبع السكريبت، احفظ SVG إلى ملف، وأعد استخدام الرسوم المتجهة فورًا. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: إنشاء مستند SVG في بايثون – دليل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: كيفية إنشاء مستند SVG وتصديره كصورة في بايثون +url: /ar/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيف تنشئ مستند SVG وتصديره كصورة في Python + +إذا كنت بحاجة إلى **create SVG document** برمجيًا، يوضح لك هذا الدرس بالضبط كيفية القيام بذلك باستخدام Python. سترى سكريبتًا كاملًا يبني دائرة بسيطة، يحفظ الـ SVG إلى ملف، وينتج صورة SVG قابلة للتصدير يمكنك تضمينها في أي مكان. + +إنشاء رسومات متجهة قابلة للتوسع من الكود يزيل الجهد اليدوي لرسم الأشكال في محرر واجهة المستخدم الرسومية. بنهاية هذا الدليل يمكنك دمج إنشاء SVG في خطوط أنابيب تصور البيانات، مولدات التقارير الآلية، أو أي مشروع يتطلب رسومات واضحة ومستقلة عن الدقة. + +## المتطلبات المسبقة + +قبل أن تبدأ، تأكد من وجود ما يلي: + +- Python 3.8 أو أحدث مثبت +- مكتبة `svgwrite` (تثبيت عبر `pip install svgwrite`) +- صلاحية كتابة في الدليل الذي سيُحفظ فيه ملف SVG + +هذه المتطلبات تجعل المثال خفيفًا ومتوافقًا مع أغلب البيئات. + +## الخطوة 1: تثبيت واستيراد مكتبة SVG + +الخطوة الأولى هي إضافة المكتبة الخارجية التي توفر واجهة برمجة تطبيقات مريحة لإنشاء SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` تُجرد بنية XML لملف SVG، مما يتيح لك التركيز على الهندسة بدلاً من العلامات الخام. + +## الخطوة 2: إنشاء كائن مستند SVG + +الآن يمكنك **create SVG document** عن طريق إنشاء كائن `svgwrite.Drawing`. يمثل هذا الكائن العنصر الجذري `` ويحمل جميع الأشكال اللاحقة. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +معامل `size` يحدد أبعاد البكسل المعروضة، بينما `viewBox` يُنشئ نظام إحداثيات يتطابق مع الهندسة التي ستُعرّفها لاحقًا. + +## الخطوة 3: إضافة عنصر دائرة + +يتم تعريف الدائرة بمركزها (`cx`, `cy`) ونصف قطرها (`r`). استخدم الدالة المساعدة `circle` لإرفاق هذه الخصائص. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +تقع الدائرة في وسط لوحة 100 × 100، مع ترك هامش 10 بكسل على كل جانب. عدّل `fill` و `stroke` لتتناسب مع لغة التصميم الخاصة بك. + +## الخطوة 4: حفظ SVG إلى ملف + +بعد تجميع الرسم، يمكنك **save SVG to file** باستخدام طريقة `save`. هذا يكتب XML منسقًا تفهمه المتصفحات ومحررات المتجهات. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +الملف `circle.svg` الآن موجود في دليل العمل الحالي. يمكنك فتحه في متصفح ويب، Inkscape، أو أي أداة تدعم صيغة SVG. + +## الخطوة 5: التحقق من صورة SVG المُصدَّرة + +افتح الملف المحفوظ في المتصفح لتأكيد النتيجة. يجب أن ترى دائرة متمركزة بالألوان المحددة. يبدو XML الخام كالتالي: + +```xml + + + + +``` + +نظرًا لأن SVG يعتمد على المتجهات، يمكنك تكبير الصورة دون فقدان الجودة، مما يجعله مثاليًا لتصاميم الويب المتجاوبة أو الطباعة عالية الدقة. + +## نصيحة احترافية: تصدير SVG كـ PNG أو JPEG + +إذا كنت بحاجة إلى نسخة نقطية، اجمع ملف SVG مع أداة تحويل مثل **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +تُظهر هذه الخطوة **export SVG image** إلى صيغة bitmap، وهو مفيد عندما لا تستطيع الأنظمة اللاحقة عرض SVG مباشرة. + +## تنويعات شائعة وحالات حافة + +| التنوع | كيفية التعامل | +|-----------|---------------| +| أشكال متعددة | استدعِ `dwg.add()` لكل عنصر جديد (rect, line, path). | +| أبعاد ديناميكية | احسب `size` و `viewBox` من البيانات قبل إنشاء `Drawing`. | +| تسميات نصية | استخدم `dwg.text("Label", insert=("10", "20"))` ونسّقها بـ `font_size` و `fill`. | +| إعادة استخدام المستند | احتفظ بكائن `Drawing` في الذاكرة واستدعِ `save()` كلما احتجت ملفًا محدثًا. | +| ملفات كبيرة | بثّ الإخراج باستخدام `dwg.tostring()` واكتب إلى كائن ملف يدويًا لتجنب الارتفاع المفاجئ في الذاكرة. | + +معالجة هذه السيناريوهات تضمن أن سكريبت **how to generate SVG** الخاص بك يتوسع من أيقونات بسيطة إلى مخططات معقدة. + +## ملخص السكريبت الكامل + +فيما يلي المثال الكامل القابل للتنفيذ الذي يدمج جميع الخطوات والتحويل الاختياري: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +تشغيل هذا السكريبت ينتج `circle.svg`، وإذا تم تثبيت `cairosvg`، ينتج أيضًا `circle.png`. كلا الملفين جاهزان للإدراج في صفحات الويب، التقارير، أو المعالجة الإضافية. + +## الخاتمة + +أنت الآن تعرف كيف **create SVG document** في Python، **save SVG to file**، و**export SVG image** للاستخدام الأوسع. يغطي المثال استدعاءات API الأساسية، يوضح سبب أهمية كل خطوة، ويقدم امتدادات للرسومات الأكثر تعقيدًا. + +بعد ذلك، استكشف مواضيع **SVG Python tutorial** إضافية مثل رسم المسارات، تطبيق التدرجات، وتحريك العناصر. سيمكنك دمج هذه التقنيات من توليد رسومات متجهة ديناميكية ومُستندة إلى البيانات مباشرة من تطبيقات Python الخاصة بك. Happy coding! + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مصدر يتضمن أمثلة شاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [إنشاء وإدارة مستندات SVG في Aspose.HTML للـ Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [حفظ مستند SVG في Aspose.HTML للـ Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – تحويل SVG إلى صورة باستخدام Aspose.HTML للـ Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/arabic/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..fd5d759f47 --- /dev/null +++ b/html/arabic/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,236 @@ +--- +category: general +date: 2026-10-02 +description: تعلم كيفية تحميل مستند HTML في بايثون باستخدام HtmlSaveOptions والبث + لمعالجة ملفات HTML الكبيرة بكفاءة. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: ar +lastmod: 2026-10-02 +og_description: تحميل مستند HTML في بايثون باستخدام HtmlSaveOptions والبث. يوضح هذا + الدرس حلاً كاملاً وجاهزًا للتنفيذ للملفات الكبيرة من HTML. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: تحميل مستند HTML باستخدام البث في بايثون – دليل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: كيفية تحميل مستند HTML باستخدام البث في بايثون +url: /ar/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تحميل مستند html باستخدام البث في بايثون + +إذا كنت بحاجة إلى **load html document** ملفات بحجم عدة مئات من الميجابايت أو أكثر، فستواجه بسرعة مشاكل في استهلاك الذاكرة. يوضح هذا الدليل حلاً كاملاً وجاهزًا للتنفيذ يستخدم **HTML streaming** للحفاظ على استهلاك الذاكرة منخفضًا مع الاستمرار في إعطائك وصولًا كاملًا إلى محتويات المستند. + +سوف تتعلم كيفية تكوين `HtmlSaveOptions`، وتمكين البث، وحفظ الملف المعالج — كل ذلك في ثلاث خطوات مختصرة فقط. لا توجد أدوات خارجية مطلوبة بخلاف حزمة `aspose.html` القياسية لبايثون، مما يجعل النهج مثاليًا للوظائف الدفعية، خطوط الأنابيب على الخادم، أو السكريبتات المحلية التي تتعامل مع **large HTML files**. + +## المتطلبات المسبقة + +* تثبيت Python 3.8 أو أحدث. +* مكتبة `aspose.html` (`pip install aspose-html`) – توفر `HTMLDocument` و `HtmlSaveOptions`. +* دليل يحتوي على ملف HTML كبير تريد العمل معه (مثال: `large.html`). + +هذه المتطلبات قليلة، لذا يمكنك التركيز على المنطق الأساسي لتحميل مستند HTML بكفاءة. + +## الخطوة 1: تحميل مستند HTML + +العملية الأولى هي إنشاء مثيل `HTMLDocument` يشير إلى ملف المصدر. هذا الكائن يمثل عملية **load html document** ويقوم بتحليل العلامات بشكل كسول، وهو أمر أساسي للتعامل مع الملفات الكبيرة. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**لماذا هذا مهم:** +إنشاء كائن `HTMLDocument` لا يقرأ الملف بالكامل إلى الذاكرة فورًا. بل يُعد محللًا تدفقيًا سيستخرج البيانات من القرص حسب الحاجة. يتيح لك هذا التصميم العمل مع ملفات تتجاوز ذاكرة RAM في جهازك. + +## الخطوة 2: تمكين البث باستخدام HtmlSaveOptions + +للحفاظ على استهلاك الذاكرة منخفضًا أثناء تعديل أو حفظ المستند، يجب تمكين وضع البث على `HtmlSaveOptions`. هذه الكلمة المفتاحية الثانوية، **HtmlSaveOptions**، تتحكم في كيفية كتابة المكتبة لملف الإخراج. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**لماذا تمكين البث؟** +عند ضبط `enable_streaming` على `True`، تقوم المكتبة بكتابة الإخراج على شكل قطع بدلاً من تخزين النتيجة بالكامل في الذاكرة. هذا أمر حاسم عندما تقوم لاحقًا **save the document** أو تنفيذ تحويلات على **large HTML files**. + +## الخطوة 3: حفظ المستند باستخدام الخيارات المكوَّنة + +الآن بعد تفعيل البث، يمكنك بأمان كتابة المحتوى المعالج إلى ملف جديد. طريقة `save` تحترم `HtmlSaveOptions` التي قمنا بتكوينها، مما يضمن أن العملية تظل فعّالة في استهلاك الذاكرة. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**ما يحدث خلف الكواليس:** +نداء `save` يبث علامات HTML إلى `large_out.html` قطعةً بقطعة. لأن المستند تم تحميله باستخدام محلل تدفقي، فإن خط الأنابيب بأكمله — من التحميل إلى الحفظ — يعمل باستهلاك ثابت ومنخفض للذاكرة. + +## مثال عملي كامل + +جمع الخطوات الثلاث معًا يمنحك سكريبتًا مختصرًا يمكنك تشغيله مباشرة من سطر الأوامر: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**الناتج المتوقع** + +عند تشغيل السكريبت (`python load_html_document_streaming.py`)، يجب أن ترى: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +ملف `large_out.html` سيكون نسخة مطابقة للأصل، لكنه تم معالجته دون تحميل الملف بالكامل إلى الذاكرة. + +## أسئلة شائعة ومعالجة الحالات الخاصة + +### هل يعمل هذا مع ملفات HTML التي تحتوي على موارد خارجية (صور، CSS، سكريبتات)؟ + +نعم. يعامل محلل البث المراجع الخارجية كسمات عادية. لا يقوم **بتنزيل** الموارد ما لم تطلب ذلك صراحة. إذا كنت بحاجة إلى تضمين تلك الموارد، يمكنك استخدام واجهات برمجة تطبيقات إضافية من `aspose.html` بعد تحميل المستند. + +### ماذا لو كان ملف المصدر تالفًا أو غير مُشكل بشكل صحيح؟ + +`HTMLDocument` سيحاول الاسترداد من الأخطاء الطفيفة، لكن التشوهات الشديدة ترفع استثناء. غلف خطوة التحميل داخل كتلة `try/except` للتعامل مع هذه الحالات بلطف: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### هل يمكنني تعديل DOM قبل الحفظ؟ + +بالطبع. بعد التحميل، لديك وصول كامل إلى شجرة DOM (`html_doc.dom`). يمكنك إدراج عقد، إزالة عناصر، أو تعديل سمات، ثم استدعاء `save` مع استمرار تمكين البث. سيظل استهلاك الذاكرة منخفضًا لأن التغييرات تُطبق بشكل تدريجي. + +### هل يؤثر البث على جودة الإخراج؟ + +لا. الإخراج المتدفق هو نسخة مطابقة بايتًا بايتًا لما ستحصل عليه من حفظ غير متدفق، بشرط ألا تكون قد أجريت أي تعديلات على DOM. البث يغيّر فقط طريقة كتابة البيانات، وليس ما يُكتب. + +## نصيحة أداء: قياس استهلاك الذاكرة + +إذا كنت تريد التحقق من أن البث يقلل فعليًا من استهلاك الذاكرة، يمكنك استخدام مكتبة `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +عادةً ما سترى فقط بضع ميغابايت من الذاكرة المستخدمة، حتى لملفات HTML بحجم 500 ميغابايت. + +## الخلاصة + +في هذا الدرس تعلمت كيفية **load html document** بكفاءة في بايثون عن طريق: + +1. إنشاء مثيل `HTMLDocument` لتحليل الملف بشكل كسول. +2. تكوين `HtmlSaveOptions` مع `enable_streaming = True` لكتابات منخفضة الذاكرة. +3. حفظ المستند مع بث الإخراج إلى القرص. + +هذه الخطوات الثلاث تمنحك نمطًا قويًا لمعالجة **large HTML files** باستخدام تقنيات **Python HTML processing**. من هنا يمكنك توسيع السكريبت لتعديل DOM، استخراج البيانات، أو معالجة دفعات من العشرات من الملفات — كل ذلك مع الحفاظ على استهلاك الذاكرة متوقعًا. + +**الخطوات التالية** + +* استكشف واجهة برمجة تطبيقات DOM في `aspose.html` لاستخراج الجداول أو الروابط أو الصور. +* اجمع هذا النهج مع تعدد الخيوط لمعالجة ملفات متعددة بالتوازي. +* اطلع على `HtmlLoadOptions` إذا كنت بحاجة للتحكم في ترميز الأحرف أو تفاصيل أخرى في التحليل. + +برمجة سعيدة، واستمتع بالطريقة الصديقة للذاكرة في **load html document** على نطاق واسع! + +## ماذا يجب أن تتعلم بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات الموضحة في هذا الدليل. كل مورد يتضمن أمثلة شاملة من التعليمات البرمجية مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [تحميل مستند HTML Java – دليل كامل مع XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [تحميل HTML باستخدام URL في .NET مع Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [كيفية تمكين JavaScript في Aspose HTML – تحميل HTML والحصول على النص](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/chinese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..430d102b35 --- /dev/null +++ b/html/chinese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-10-02 +description: 在 Python 中将 HTML 转换为 Markdown,提供完整示例。了解如何将 HTML 保存为 Markdown,选择格式化器,并启用特定功能。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: zh +lastmod: 2026-10-02 +og_description: 使用实用代码、格式化选项和功能标志,在 Python 中将 HTML 转换为 Markdown。按照本指南快速将 HTML 保存为 + Markdown。 +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: 在 Python 中将 HTML 转换为 Markdown – 完整教程 +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: 如何在 Python 中将 HTML 转换为 Markdown——一步步指南 +url: /zh/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中将 HTML 转换为 Markdown – 步骤指南 + +如果您需要 **将 HTML 转换为 Markdown**,本指南将为您展示一个完整、可运行的 Python 解决方案。您将了解如何 **将 HTML 保存为 Markdown**、选择合适的格式化器,以及仅启用您关心的功能。 + +将 HTML 转换为 Markdown 是在需要轻量文档、静态站点内容或受版本控制的文本文件时的常见任务。本教程涵盖从安装库到处理边缘情况的全部内容,帮助您将此技术应用于任何 HTML 源。 + +## 前置条件 + +在开始之前,请确保您具备: + +* 已安装 Python 3.8 或更高版本。 +* 可使用 `pip` 安装第三方包。 +* 对 HTML 标签和 Markdown 语法有基本了解。 + +由于转换库是纯 Python 实现,无需额外的系统依赖。 + +## 安装 GroupDocs Conversion 库 + +代码示例使用 **GroupDocs.Conversion** Python 包,提供 `HTMLDocument`、`MarkdownSaveOptions` 和 `Converter`。使用以下命令进行安装: + +```bash +pip install groupdocs-conversion +``` + +> **专业提示:** 使用虚拟环境(`python -m venv venv`)可以将该包与其他项目隔离。 + +## 第一步:从字符串创建 `HTMLDocument` + +第一步是将原始 HTML 包装到 `HTMLDocument` 实例中。该对象抽象了源,无论是来自字符串、文件还是远程 URL。 + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*原因说明:* `HTMLDocument` 只会解析一次标记,使转换器能够使用规范化的表示,而不是原始文本。 + +## 第二步:配置 `MarkdownSaveOptions` + +`MarkdownSaveOptions` 让您控制输出格式以及生成哪些 Markdown 特性。库支持两种格式化器: + +* **DEFAULT** – 标准的 CommonMark 兼容 Markdown。 +* **GIT** – Git 风格的 Markdown(支持表格、删除线等)。 + +在大多数版本控制场景下,推荐使用 **GIT** 格式化器。 + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### 仅启用所需特性 + +您可以通过打开特定的特性标志来微调输出。在本例中,我们保留 **links**(链接)和 **paragraphs**(段落),同时禁用 images(图片)、tables(表格)以及其他结构。 + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*原因说明:* 限制特性可以减小生成文件的体积,并防止下游工具不支持的意外 Markdown 元素。 + +## 第三步:转换文档 + +有了源 `HTMLDocument` 与配置好的 `MarkdownSaveOptions`,只需一次调用 `Converter.convert` 即可完成转换。为输出文件提供绝对或相对路径。 + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +调用结束后,`output.md` 将包含原始 HTML 的 Markdown 表示。 + +## 可直接运行的完整脚本 + +下面是整合了上述所有步骤的完整、独立脚本。将其保存为 `html_to_md.py` 并运行 `python html_to_md.py`。 + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### 预期输出 (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +输出保持了原始 HTML 的结构,仅保留我们启用的特性(链接、段落和列表)。 + +## 处理常见边缘情况 + +### 缺失或格式错误的 `href` 属性 + +如果 `` 标签缺少有效的 `href`,转换器会仅插入链接文本而不带 URL。为保持可读性,您可能需要对生成的 Markdown 进行后处理: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### 转换大型 HTML 文件 + +对于多兆字节的 HTML 文件,建议流式读取输入,以避免一次性将全部标记加载到内存中: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +转换过程本身保持不变,因为 `HTMLDocument` 已抽象了源的大小。 + +## 替代格式化器 + +如果您更倾向于纯 CommonMark 而非 Git 风格的输出,只需切换格式化器: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +这样会生成更简洁的 Markdown 文件,适用于不支持 Git 扩展的平台。 + +## 您可能想要探索的相关任务 + +* **将 Markdown 转回 HTML** – 便于预览文档。 +* **将 HTML 导出为 PDF** – 另一个常见的 **html to markdown conversion** 相关工作流。 +* **批量处理文件夹中的 HTML 文件** – 循环遍历文件并复用相同的 `MarkdownSaveOptions` 实例。 + +所有这些都遵循相同的模式:创建源文档、配置保存选项,然后调用 `Converter.convert`。 + +## 结论 + +现在,您已经掌握了在 Python 中 **将 HTML 转换为 Markdown** 的方法,了解了如何 **将 HTML 保存为 Markdown** 并精确控制特性,以及为何为下游工具选择合适的格式化器至关重要。示例展示了一种简洁、可复用的做法,适用于单个字符串、文件或 URL,并提供了处理缺失链接和大文件输入的技巧。 + +欢迎尝试更多 `MarkdownSaveOptions.Features`(如 `IMAGE`、`TABLE`),以根据项目需求定制输出。如果本指南对您有帮助,请与团队分享或在项目文档中链接。祝转换愉快! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/chinese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..c10820625b --- /dev/null +++ b/html/chinese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,213 @@ +--- +category: general +date: 2026-10-02 +description: 学习如何在 Python 中创建 SVG 文档,将 SVG 保存到文件,并使用简短完整的脚本导出 SVG 图像。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: zh +lastmod: 2026-10-02 +og_description: 使用 Python 创建 SVG 文档,并通过本实用教程导出 SVG 图像。按照脚本操作,将 SVG 保存到文件,立即重复使用矢量图形。 +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: 使用 Python 创建 SVG 文档 – 步骤指南 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: 如何在 Python 中创建 SVG 文档并将其导出为图像 +url: /zh/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中创建 SVG 文档并导出为图像 + +如果你需要 **创建 SVG 文档**(programmatically),本教程将手把手教你使用 Python 完成。你将看到一个完整的脚本,构建一个简单的圆形,将 SVG 保存到文件,并生成可在任何地方嵌入的可导出 SVG 图像。 + +通过代码生成可伸缩矢量图形(SVG),可以省去在 GUI 编辑器中手动绘制形状的工作。阅读完本指南后,你可以将 SVG 创建集成到数据可视化管道、自动化报告生成器或任何需要清晰、分辨率无关图形的项目中。 + +## 前置条件 + +在开始之前,请确保你具备以下条件: + +- 已安装 Python 3.8 或更高版本 +- 已安装 `svgwrite` 库(使用 `pip install svgwrite` 安装) +- 对将保存 SVG 的目录拥有写入权限 + +这些要求保持示例轻量且兼容大多数环境。 + +## 第一步:安装并导入 SVG 库 + +第一步是添加提供便捷 API 用于 SVG 创建的第三方库。 + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` 抽象了 SVG 文件的 XML 结构,让你专注于几何形状,而不是原始标记。 + +## 第二步:创建 SVG 文档对象 + +现在可以通过实例化 `svgwrite.Drawing` **创建 SVG 文档**。该对象代表根 `` 元素,并保存所有后续的形状。 + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` 参数定义渲染后的像素尺寸,而 `viewBox` 建立与后续几何定义相匹配的坐标系。 + +## 第三步:添加圆形元素 + +圆形由中心点 (`cx`, `cy`) 和半径 (`r`) 定义。使用 `circle` 辅助方法来设置这些属性。 + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +该圆位于 100 × 100 画布的中心,两侧各留有 10 像素的边距。根据你的设计语言调整 `fill` 和 `stroke`。 + +## 第四步:将 SVG 保存到文件 + +图形组装完成后,你可以使用 `save` 方法 **将 SVG 保存到文件**。这会写入符合规范的 XML,浏览器和矢量编辑器都能识别。 + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +文件 `circle.svg` 现在位于当前工作目录。你可以在网页浏览器、Inkscape 或任何支持 SVG 格式的工具中打开它。 + +## 第五步:验证导出的 SVG 图像 + +在浏览器中打开已保存的文件以确认输出。你应该会看到一个居中的圆形,颜色与指定的一致。原始 XML 如下所示: + +```xml + + + + +``` + +由于 SVG 基于矢量,你可以在不损失质量的情况下缩放图像,这使其非常适合响应式网页设计或高分辨率打印。 + +## 小技巧:将 SVG 导出为 PNG 或 JPEG + +如果需要栅格版本,可以结合 **CairoSVG** 等转换工具: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +此步骤演示了 **导出 SVG 图像** 为位图格式,当下游系统无法直接渲染 SVG 时非常有用。 + +## 常见变体和边缘情况 + +| 变体 | 处理方式 | +|-----------|---------------| +| 多个形状 | 对每个新元素(矩形、直线、路径)调用 `dwg.add()`。 | +| 动态尺寸 | 在创建 `Drawing` 前根据数据计算 `size` 和 `viewBox`。 | +| 文本标签 | 使用 `dwg.text("Label", insert=("10", "20"))` 并通过 `font_size` 与 `fill` 设置样式。 | +| 重复使用文档 | 将 `Drawing` 对象保存在内存中,需要更新文件时调用 `save()`。 | +| 大文件 | 使用 `dwg.tostring()` 流式输出并手动写入文件对象,以避免内存峰值。 | + +处理这些场景可确保你的 **如何生成 SVG** 脚本能够从简单图标扩展到复杂图表。 + +## 完整脚本回顾 + +下面是包含所有步骤及可选转换的完整可运行示例: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +运行此脚本会生成 `circle.svg`,如果已安装 `cairosvg`,还会生成 `circle.png`。这两个文件均可直接用于网页、报告或后续处理。 + +## 结论 + +现在你已经掌握了在 Python 中 **创建 SVG 文档**、**将 SVG 保存到文件**,以及 **导出 SVG 图像** 以供更广泛使用的完整流程。示例涵盖了关键 API 调用,解释了每一步的意义,并提供了面向更复杂图形的扩展思路。 + +接下来,探索更多 **SVG Python 教程** 主题,如绘制路径、应用渐变以及为元素添加动画。将这些技术融入你的 Python 应用,即可直接生成动态、数据驱动的矢量图形。祝编码愉快! + + +## 接下来你应该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助你在已有技巧的基础上进一步提升。每个资源都提供完整的可运行代码示例,并配有逐步解释,帮助你掌握更多 API 功能并在项目中尝试不同实现方式。 + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/chinese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..2f0c14400a --- /dev/null +++ b/html/chinese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,238 @@ +--- +category: general +date: 2026-10-02 +description: 学习如何在 Python 中使用 HtmlSaveOptions 和流式处理来高效加载 HTML 文档并处理大型 HTML 文件。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: zh +lastmod: 2026-10-02 +og_description: 使用 HtmlSaveOptions 和流式处理在 Python 中加载 HTML 文档。本教程展示了一个完整、可直接运行的针对大型 + HTML 文件的解决方案。 +og_image_alt: Diagram showing load html document using streaming in Python +og_title: 在 Python 中使用流式加载 HTML 文档 – 步骤指南 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: 如何在 Python 中通过流式方式加载 HTML 文档 +url: /zh/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中使用流式加载 HTML 文档 + +如果你需要 **加载 html 文档** 文件,且文件大小达到数百兆甚至更大,你很快就会遇到内存使用问题。本指南展示了一个完整、可直接运行的解决方案,使用 **HTML 流式** 方式在保持低内存消耗的同时,仍然可以完整访问文档内容。 + +你将学习如何配置 `HtmlSaveOptions`、启用流式处理并保存处理后的文件——整个过程仅需三步。无需除标准 `aspose.html` Python 包之外的任何外部工具,使该方法非常适合批处理作业、服务器端流水线或本地脚本处理 **大型 HTML 文件**。 + +## 前置条件 + +在开始之前,请确保你已具备: + +* 已安装 Python 3.8 或更高版本。 +* 已安装 `aspose.html` 库(`pip install aspose-html`)——该库提供 `HTMLDocument` 和 `HtmlSaveOptions`。 +* 包含待处理大型 HTML 文件的目录(例如 `large.html`)。 + +这些要求极其简洁,便于你专注于高效加载 HTML 文档的核心逻辑。 + +## 步骤 1:加载 HTML 文档 + +首要操作是创建指向源文件的 `HTMLDocument` 实例。该对象代表 **load html document** 操作,并以惰性方式解析标记,这对处理大文件至关重要。 + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**为什么重要:** +创建 `HTMLDocument` 对象并不会立即将整个文件读取到内存中,而是准备一个流式解析器,根据需要从磁盘拉取数据。这种设计让你能够处理超出机器 RAM 容量的文件。 + +## 步骤 2:使用 HtmlSaveOptions 启用流式 + +为了在操作或保存文档时保持低内存占用,需要在 `HtmlSaveOptions` 上启用流式模式。这个二级关键字 **HtmlSaveOptions** 控制库写出输出文件的方式。 + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**为何要启用流式?** +当 `enable_streaming` 设置为 `True` 时,库会分块写出输出,而不是在内存中缓冲整个结果。这在随后 **save the document** 或对 **large HTML files** 进行转换时尤为关键。 + +## 步骤 3:使用已配置的选项保存文档 + +流式已激活后,你可以安全地将处理后的内容写入新文件。`save` 方法会遵循我们配置的 `HtmlSaveOptions`,确保操作保持内存高效。 + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**幕后发生了什么:** +`save` 调用会将 HTML 标记逐块流式写入 `large_out.html`。由于文档是使用流式解析器加载的,整个流水线——从加载到保存——都以恒定、低内存的方式运行。 + +## 完整工作示例 + +将上述三步组合起来,即可得到一个可直接在命令行运行的紧凑脚本: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**预期输出** + +运行脚本 (`python load_html_document_streaming.py`) 时,你应看到: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` 文件将是原文件的忠实拷贝,但整个过程从未将完整文件加载到 RAM 中。 + +## 常见问题与边缘情况处理 + +### 这能处理包含外部资源(图片、CSS、脚本)的 HTML 文件吗? + +可以。流式解析器将外部引用视为普通属性,**不会** 下载资源,除非你显式请求。如果需要嵌入这些资源,可在文档加载后使用 `aspose.html` 的其他 API。 + +### 如果源文件损坏或不是良好结构的 HTML 会怎样? + +`HTMLDocument` 会尝试从轻微错误中恢复,但严重的结构错误会抛出异常。建议将加载步骤放入 `try/except` 块,以优雅地处理此类情况: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### 我可以在保存前修改 DOM 吗? + +完全可以。加载后,你可以通过 `html_doc.dom` 完全访问 DOM 树,插入节点、删除元素或修改属性,然后仍然使用流式方式调用 `save`。由于更改是增量应用的,内存使用仍保持低位。 + +### 流式会影响输出质量吗? + +不会。只要你没有对 DOM 做任何修改,流式输出在字节上与非流式保存完全相同。流式仅改变数据写入方式,而不改变写入内容。 + +## 性能提示:测量内存使用 + +如果想验证流式真的降低了内存消耗,可以使用 `psutil` 库: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +即使处理 500 MB 的 HTML 文件,你通常也只会看到几兆字节的 RAM 使用量。 + +## 结论 + +本教程教会你如何在 Python 中高效 **load html document**: + +1. 实例化 `HTMLDocument`,惰性解析文件。 +2. 使用 `HtmlSaveOptions` 并将 `enable_streaming = True`,实现低内存写入。 +3. 在流式模式下保存文档到磁盘。 + +这三步为处理 **large HTML files** 提供了可靠模式,适用于 **Python HTML processing** 场景。随后,你可以扩展脚本以修改 DOM、提取数据或批量处理数十个文件——所有操作均保持可预测的内存使用。 + +**后续步骤** + +* 探索 `aspose.html` 的 DOM API,提取表格、链接或图片。 +* 将此方法与多线程结合,平行处理多个文件。 +* 如需控制字符编码或其他解析细节,可了解 `HtmlLoadOptions`。 + +祝编码愉快,尽情享受在大规模 **load html document** 时的内存友好方式! + + +## 接下来你应该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助你在项目中进一步掌握 API 功能并探索替代实现方式,每篇资源均提供完整可运行的代码示例和逐步解释。 + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/czech/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..4c2f36df26 --- /dev/null +++ b/html/czech/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-10-02 +description: Převod HTML na Markdown v Pythonu s kompletním příkladem. Naučte se, + jak uložit HTML jako Markdown, vybrat formátovače a povolit specifické funkce. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: cs +lastmod: 2026-10-02 +og_description: Převod HTML na Markdown v Pythonu s praktickým kódem, možnostmi formátování + a příznaky funkcí. Postupujte podle tohoto návodu a rychle uložte HTML jako Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Převod HTML na Markdown v Pythonu – kompletní tutoriál +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Jak převést HTML na Markdown v Pythonu – krok za krokem průvodce +url: /cs/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak převést HTML na Markdown v Pythonu – krok za krokem průvodce + +Pokud potřebujete **převést HTML na Markdown**, tento průvodce vám ukáže kompletní, spustitelné řešení v Pythonu. Uvidíte, jak **uložit HTML jako Markdown**, vybrat správný formátovač a povolit jen funkce, na kterých vám záleží. + +Převod HTML na Markdown je běžný úkol, když chcete lehkou dokumentaci, obsah statických stránek nebo textové soubory pod verzovacím systémem. Tento tutoriál pokrývá vše od instalace knihovny po zpracování okrajových případů, takže můžete techniku použít na jakýkoli zdroj HTML. + +## Požadavky + +* Nainstalovaný Python 3.8 nebo novější. +* Přístup k `pip` pro instalaci balíčků třetích stran. +* Základní znalost HTML tagů a syntaxe Markdownu. + +Žádné další systémové závislosti nejsou vyžadovány, protože knihovna pro převod je čistě v Pythonu. + +## Instalace knihovny GroupDocs Conversion + +Ukázkový kód používá Python balíček **GroupDocs.Conversion**, který poskytuje `HTMLDocument`, `MarkdownSaveOptions` a `Converter`. Nainstalujte jej pomocí: + +```bash +pip install groupdocs-conversion +``` + +> **Tip:** Použijte virtuální prostředí (`python -m venv venv`), aby byl balíček izolován od ostatních projektů. + +## Krok 1: Vytvořte `HTMLDocument` ze řetězce + +Prvním krokem je zabalit vaše surové HTML do instance `HTMLDocument`. Tento objekt abstrahuje zdroj, ať už pochází ze řetězce, souboru nebo vzdálené URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Proč je to důležité:* `HTMLDocument` analyzuje značky jednou, což umožňuje konvertoru pracovat s normalizovanou reprezentací místo surového textu. + +## Krok 2: Nakonfigurujte `MarkdownSaveOptions` + +`MarkdownSaveOptions` vám umožňuje řídit výstupní formát a které funkce Markdownu jsou generovány. Knihovna podporuje dva formátovače: + +* **DEFAULT** – standardní CommonMark‑kompatibilní Markdown. +* **GIT** – Git‑flavored Markdown (přidává tabulky, přeškrtnutí atd.). + +Pro většinu scénářů s verzovacím systémem je upřednostňován formátovač **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Povolení pouze potřebných funkcí + +Můžete jemně doladit výstup zapnutím konkrétních příznaků funkcí. V tomto příkladu zachováváme **odkazy** a **odstavce**, zatímco zakazujeme obrázky, tabulky a další konstrukce. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Proč je to důležité:* Omezení funkcí snižuje velikost generovaného souboru a zabraňuje neočekávaným Markdown elementům, které downstream nástroje nemusí podporovat. + +## Krok 3: Převod dokumentu + +S `HTMLDocument` jako zdrojem a nakonfigurovanými `MarkdownSaveOptions` je převod jedním voláním `Converter.convert`. Zadejte absolutní nebo relativní cestu k výstupnímu souboru. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Po dokončení volání `output.md` obsahuje Markdownovou reprezentaci původního HTML. + +## Kompletní skript, který můžete spustit ještě dnes + +Níže je kompletní, samostatný skript, který zahrnuje všechny předchozí kroky. Uložte jej jako `html_to_md.py` a spusťte `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Očekávaný výstup (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Výstup odpovídá původní struktuře HTML a zároveň zobrazuje pouze funkce, které jsme povolili (odkazy, odstavce a seznamy). + +## Zpracování běžných okrajových případů + +### Chybějící nebo poškozené atributy `href` + +Pokud `` tag postrádá platný `href`, konvertor vloží text odkazu bez URL. Pro zachování čitelnosti můžete chtít po‑zpracovat Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Převod velkých HTML souborů + +U HTML souborů o velikosti několika megabajtů streamujte vstup, aby se načetl celý markup neukládal do paměti: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Samotný proces převodu zůstává nezměněn, protože `HTMLDocument` abstrahuje velikost zdroje. + +## Alternativní formátovače + +Pokud dáváte přednost čistému CommonMark místo Git‑flavored výstupu, přepněte formátovač: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +To poskytne minimalističtější Markdown soubor, užitečný, když cílíte na platformy, které nepodporují Git rozšíření. + +## Související úkoly, které můžete dále zkoumat + +* **Převést Markdown zpět na HTML** – užitečné pro náhled dokumentace. +* **Exportovat HTML do PDF** – další běžný workflow související s **html to markdown conversion**. +* **Dávkově zpracovat složku HTML souborů** – procházet soubory a znovu použít stejnou instanci `MarkdownSaveOptions`. + +Všechny tyto postupy následují stejný vzor: vytvořit zdrojový dokument, nakonfigurovat možnosti uložení a zavolat `Converter.convert`. + +## Závěr + +Nyní víte, jak **převést HTML na Markdown** v Pythonu, jak **uložit HTML jako Markdown** s přesnou kontrolou funkcí, a proč výběr správného formátovače má význam pro downstream nástroje. Příklad ukazuje čistý, znovupoužitelný přístup, který funguje pro jednotlivé řetězce, soubory nebo URL, a obsahuje tipy pro zpracování chybějících odkazů a velkých vstupů. + +Neváhejte experimentovat s dalšími `MarkdownSaveOptions.Features` (např. `IMAGE`, `TABLE`), abyste přizpůsobili výstup potřebám vašeho projektu. Pokud vám tento průvodce přišel užitečný, sdílejte ho s kolegy nebo na něj odkažte ve své projektové dokumentaci. Šťastný převod! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/czech/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..40c1283818 --- /dev/null +++ b/html/czech/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Naučte se, jak vytvořit SVG dokument v Pythonu, uložit SVG do souboru + a exportovat SVG obrázek pomocí krátkého, kompletního skriptu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: cs +lastmod: 2026-10-02 +og_description: Vytvořte SVG dokument v Pythonu a exportujte SVG obrázek pomocí tohoto + praktického tutoriálu. Postupujte podle skriptu, uložte SVG do souboru a okamžitě + znovu použijte vektorovou grafiku. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Vytvořte SVG dokument v Pythonu – krok za krokem +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Jak vytvořit SVG dokument a exportovat jej jako obrázek v Pythonu +url: /cs/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak vytvořit SVG dokument a exportovat jej jako obrázek v Pythonu + +Pokud potřebujete **create SVG document** programově, tento tutoriál vám přesně ukáže, jak to provést v Pythonu. Uvidíte kompletní skript, který vytvoří jednoduchý kruh, uloží SVG do souboru a vytvoří exportovatelný SVG obrázek, který můžete vložit kamkoli. + +Generování škálovatelných vektorových grafik z kódu odstraňuje ruční úsilí při kreslení tvarů v GUI editoru. Na konci tohoto průvodce budete schopni integrovat tvorbu SVG do pipeline pro vizualizaci dat, automatizovaných generátorů reportů nebo jakéhokoli projektu, který vyžaduje ostrou, rozlišením nezávislou grafiku. + +## Prerequisites + +Než začnete, ujistěte se, že máte: + +- Python 3.8 nebo novější nainstalovaný +- Knihovnu `svgwrite` (nainstalujte pomocí `pip install svgwrite`) +- Oprávnění k zápisu do adresáře, kam bude SVG uloženo + +Tyto požadavky udržují příklad lehký a kompatibilní s většinou prostředí. + +## Step 1: Install and import the SVG library + +Prvním krokem je přidat knihovnu třetí strany, která poskytuje pohodlné API pro tvorbu SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrahuje XML strukturu SVG souboru, což vám umožní soustředit se na geometrii místo surového markupu. + +## Step 2: Create an SVG document object + +Nyní můžete **create SVG document** vytvořením instance `svgwrite.Drawing`. Tento objekt představuje kořenový element `` a obsahuje všechny následné tvary. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Argument `size` určuje vykreslené rozměry v pixelech, zatímco `viewBox` nastavuje souřadnicový systém, který odpovídá geometrii, kterou později definujete. + +## Step 3: Add a circle element + +Kruh je definován svým středem (`cx`, `cy`) a poloměrem (`r`). Použijte pomocnou funkci `circle` k přiřazení těchto atributů. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Kruh leží uprostřed plátna 100 × 100, přičemž na každé straně zůstává okraj 10 pixelů. Upravit `fill` a `stroke` tak, aby odpovídaly vašemu designu. + +## Step 4: Save the SVG to file + +Po sestavení grafiky můžete **save SVG to file** pomocí metody `save`. Tím se zapíše dobře strukturované XML, které rozumí prohlížeče i vektorové editory. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Soubor `circle.svg` se nyní nachází v aktuálním pracovním adresáři. Můžete jej otevřít ve webovém prohlížeči, Inkscape nebo v jakémkoli nástroji, který podporuje formát SVG. + +## Step 5: Verify the exported SVG image + +Otevřete uložený soubor v prohlížeči a ověřte výstup. Měli byste vidět centrovaný kruh se zadanými barvami. Surové XML vypadá takto: + +```xml + + + + +``` + +Protože SVG je vektorové, můžete obrázek škálovat bez ztráty kvality, což je ideální pro responzivní webové designy nebo tisk ve vysokém rozlišení. + +## Pro tip: Export SVG as PNG or JPEG + +Pokud potřebujete rastrovou verzi, zkombinujte SVG soubor s konverzním nástrojem, například **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Tento krok demonstruje **export SVG image** do bitmapového formátu, užitečný, když downstream systémy nedokážou SVG přímo renderovat. + +## Common variations and edge cases + +| Variace | Jak postupovat | +|-----------|---------------| +| Více tvarů | Zavolejte `dwg.add()` pro každý nový prvek (rect, line, path). | +| Dynamické rozměry | Vypočítejte `size` a `viewBox` z dat před vytvořením `Drawing`. | +| Textové popisky | Použijte `dwg.text("Label", insert=("10", "20"))` a stylizujte pomocí `font_size` a `fill`. | +| Opětovné použití dokumentu | Uchovejte objekt `Drawing` v paměti a zavolejte `save()`, kdykoli potřebujete aktualizovaný soubor. | +| Velké soubory | Streamujte výstup pomocí `dwg.tostring()` a zapište jej ručně do souborového objektu, abyste předešli špičkám paměti. | + +Řešení těchto scénářů zajišťuje, že váš **how to generate SVG** skript škáluje od jednoduchých ikon po složité diagramy. + +## Full script recap + +Níže je kompletní, spustitelný příklad, který zahrnuje všechny kroky a volitelnou konverzi: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Spuštěním tohoto skriptu vznikne `circle.svg` a pokud je nainstalován `cairosvg`, také `circle.png`. Oba soubory jsou připravené k vložení do webových stránek, reportů nebo dalšího zpracování. + +## Conclusion + +Nyní víte, jak **create SVG document** v Pythonu, **save SVG to file** a **export SVG image** pro širší využití. Příklad pokrývá základní API volání, vysvětluje, proč je každý krok důležitý, a nabízí rozšíření pro složitější grafiku. + +Dále prozkoumejte další témata **SVG Python tutorial**, jako je kreslení cest, aplikace gradientů a animace elementů. Integrací těchto technik budete schopni generovat dynamické, datově řízené vektorové grafiky přímo z vašich Python aplikací. Šťastné kódování! + +## What Should You Learn Next? + +Následující tutoriály pokrývají úzce související témata, která staví na technikách předvedených v tomto průvodci. Každý zdroj obsahuje kompletní funkční ukázky kódu s krok za krokem vysvětleními, aby vám pomohl zvládnout další funkce API a prozkoumat alternativní přístupy k implementaci ve vašich projektech. + +- [Vytváření a správa SVG dokumentů v Aspose.HTML pro Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Uložení SVG dokumentu v Aspose.HTML pro Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg na png java – Převod SVG na obrázek s Aspose.HTML pro Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/czech/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..22d0c4bf1b --- /dev/null +++ b/html/czech/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,239 @@ +--- +category: general +date: 2026-10-02 +description: Naučte se načíst HTML dokument v Pythonu pomocí HtmlSaveOptions a streamování + pro efektivní zpracování velkých HTML souborů. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: cs +lastmod: 2026-10-02 +og_description: Načtěte HTML dokument v Pythonu pomocí HtmlSaveOptions a streamování. + Tento tutoriál ukazuje kompletní, připravené k okamžitému spuštění řešení pro velké + HTML soubory. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Načtení HTML dokumentu pomocí streamování v Pythonu – krok za krokem průvodce +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Jak načíst HTML dokument pomocí streamování v Pythonu +url: /cs/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak načíst html dokument pomocí streamingu v Pythonu + +Pokud potřebujete **načíst html dokument** soubory, které mají několik set megabajtů nebo více, rychle narazíte na problémy s využitím paměti. Tento průvodce vám ukáže kompletní, připravené řešení, které používá **HTML streaming** k udržení nízké spotřeby paměti a zároveň vám poskytuje plný přístup k obsahu dokumentu. + +Naučíte se, jak nakonfigurovat `HtmlSaveOptions`, povolit streaming a uložit zpracovaný soubor – vše během tří stručných kroků. Nepotřebujete žádné externí nástroje mimo standardní balíček `aspose.html` pro Python, což činí tento přístup ideálním pro dávkové úlohy, server‑side pipeline nebo lokální skripty pracující s **velkými HTML soubory**. + +## Požadavky + +Než začnete, ujistěte se, že máte: + +* Python 3.8 nebo novější nainstalovaný. +* Knihovnu `aspose.html` (`pip install aspose-html`) – poskytuje `HTMLDocument` a `HtmlSaveOptions`. +* Adresář, který obsahuje velký HTML soubor, se kterým chcete pracovat (např. `large.html`). + +Tyto požadavky jsou minimální, takže se můžete soustředit na jádro logiky efektivního načítání HTML dokumentu. + +## Krok 1: Načtení HTML dokumentu + +Prvním krokem je vytvořit instanci `HTMLDocument`, která ukazuje na zdrojový soubor. Tento objekt představuje operaci **load html document** a parsuje značky líně, což je nezbytné pro práci s velkými soubory. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Proč je to důležité:** +Vytvoření objektu `HTMLDocument` nečte okamžitě celý soubor do paměti. Místo toho připraví streamingový parser, který bude data z disku načítat podle potřeby. Tento design vám umožní pracovat se soubory, které přesahují RAM vašeho počítače. + +## Krok 2: Povolení streamingu pomocí HtmlSaveOptions + +Aby byl paměťový otisk co nejmenší během manipulace nebo ukládání dokumentu, musíte povolit režim streamingu na `HtmlSaveOptions`. Tento sekundární klíč, **HtmlSaveOptions**, řídí, jak knihovna zapisuje výstupní soubor. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Proč povolit streaming?** +Když je `enable_streaming` nastaveno na `True`, knihovna zapisuje výstup po částech místo toho, aby bufferovala celý výsledek v paměti. To je klíčové, když později **uložíte dokument** nebo provádíte transformace na **velkých HTML souborech**. + +## Krok 3: Uložení dokumentu s nakonfigurovanými možnostmi + +Nyní, když je streaming aktivní, můžete bezpečně zapsat zpracovaný obsah do nového souboru. Metoda `save` respektuje `HtmlSaveOptions`, které jsme nakonfigurovali, a zajišťuje, že operace zůstane paměťově úsporná. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Co se děje v pozadí:** +Volání `save` streamuje HTML značky do `large_out.html` po částech. Protože byl dokument načten pomocí streamingového parseru, celý řetězec – od načtení po uložení – pracuje s konstantní, nízkou spotřebou paměti. + +## Kompletní funkční příklad + +Spojením tří kroků získáte kompaktní skript, který můžete spustit přímo z příkazové řádky: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Očekávaný výstup** + +Po spuštění skriptu (`python load_html_document_streaming.py`) byste měli vidět: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Soubor `large_out.html` bude věrnou kopií originálu, ale byl zpracován bez načtení celého souboru do RAM. + +## Časté otázky a řešení okrajových případů + +### Funguje to s HTML soubory, které obsahují externí zdroje (obrázky, CSS, skripty)? + +Ano. Streamingový parser zachází s externími odkazy jako s běžnými atributy. **Nestáhne** zdroje, pokud je výslovně nepožádáte. Pokud potřebujete tyto zdroje vložit, můžete po načtení dokumentu použít další API z `aspose.html`. + +### Co když je zdrojový soubor poškozený nebo není dobře formovaný HTML? + +`HTMLDocument` se pokusí opravit menší chyby, ale vážnější porušení vyvolá výjimku. Zabalte krok načítání do bloku `try/except`, abyste takové situace ošetřili elegantně: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Mohu upravit DOM před uložením? + +Rozhodně. Po načtení máte plný přístup k DOM stromu (`html_doc.dom`). Můžete vkládat uzly, odstraňovat elementy nebo měnit atributy a poté zavolat `save` se stále povoleným streamingem. Spotřeba paměti zůstane nízká, protože změny jsou aplikovány postupně. + +### Ovlivňuje streaming kvalitu výstupu? + +Ne. Streamovaný výstup je byte‑for‑byte identický s tím, který byste získali při ne‑streamovaném uložení, pokud jste neprovedli žádné úpravy DOM. Streaming mění jen způsob zápisu dat, ne jejich obsah. + +## Tip na výkon: měření využití paměti + +Chcete‑li ověřit, že streaming skutečně snižuje spotřebu paměti, můžete použít knihovnu `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Obvykle uvidíte jen několik megabajtů RAM, i u 500 MB HTML souborů. + +## Závěr + +V tomto tutoriálu jste se naučili, jak **load html document** efektivně v Pythonu pomocí: + +1. Vytvořením instance `HTMLDocument` pro líné parsování souboru. +2. Nakonfigurováním `HtmlSaveOptions` s `enable_streaming = True` pro zápisy s nízkou spotřebou paměti. +3. Uložením dokumentu při streamování výstupu na disk. + +Tyto tři kroky vám poskytují robustní vzor pro zpracování **velkých HTML souborů** pomocí technik **Python HTML processing**. Odtud můžete skript rozšířit o úpravy DOM, extrakci dat nebo dávkové zpracování desítek souborů – vše při předvídatelné spotřebě paměti. + +**Další kroky** + +* Prozkoumejte DOM API `aspose.html` pro extrakci tabulek, odkazů nebo obrázků. +* Kombinujte tento přístup s multithreadingem pro paralelní zpracování více souborů. +* Podívejte se na `HtmlLoadOptions`, pokud potřebujete řídit kódování znaků nebo jiné nuance parsování. + +Šťastné programování a užívejte si paměťově přátelský způsob, jak **load html document** ve velkém měřítku! + +## Co byste se měli naučit dál? + +Následující tutoriály pokrývají úzce související témata, která staví na technikách předvedených v tomto průvodci. Každý zdroj obsahuje kompletní funkční ukázky kódu s krok‑za‑krokem vysvětleními, která vám pomohou zvládnout další funkce API a prozkoumat alternativní implementační přístupy ve vašich projektech. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/dutch/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..a2dc70e8dc --- /dev/null +++ b/html/dutch/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Converteer HTML naar Markdown in Python met een volledig voorbeeld. Leer + hoe je HTML opslaat als Markdown, formatters kiest en specifieke functies inschakelt. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: nl +lastmod: 2026-10-02 +og_description: Converteer HTML naar Markdown in Python met praktische code, formatteringsopties + en feature‑flags. Volg deze gids om HTML snel als Markdown op te slaan. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: HTML naar Markdown converteren in Python – volledige tutorial +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Hoe HTML naar Markdown te converteren in Python – stap‑voor‑stap gids +url: /nl/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe HTML naar Markdown te converteren in Python – stapsgewijze handleiding + +Als je **HTML naar Markdown wilt converteren**, laat deze gids je een complete, uitvoerbare oplossing zien in Python. Je ziet hoe je **HTML als Markdown opslaat**, de juiste formatter kiest en alleen de functies inschakelt die je nodig hebt. + +HTML naar Markdown converteren is een veelvoorkomende taak wanneer je lichte documentatie, statische‑site‑inhoud of versie‑gecontroleerde tekstbestanden wilt. Deze tutorial behandelt alles, van het installeren van de bibliotheek tot het afhandelen van randgevallen, zodat je de techniek op elke HTML‑bron kunt toepassen. + +## Vereisten + +Voordat je begint, zorg ervoor dat je het volgende hebt: + +* Python 3.8 of nieuwer geïnstalleerd. +* `pip`-toegang om third‑party pakketten te installeren. +* Basiskennis van HTML‑tags en Markdown‑syntaxis. + +Er zijn geen extra systeemeisen nodig omdat de conversiebibliotheek pure Python is. + +## Installeer de GroupDocs Conversion bibliotheek + +Het code‑voorbeeld gebruikt het **GroupDocs.Conversion** Python‑pakket, dat `HTMLDocument`, `MarkdownSaveOptions` en `Converter` levert. Installeer het met: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** Gebruik een virtuele omgeving (`python -m venv venv`) om het pakket geïsoleerd te houden van andere projecten. + +## Stap 1: Maak een `HTMLDocument` van een string + +De eerste stap is om je ruwe HTML te verpakken in een `HTMLDocument`‑instantie. Dit object abstraheert de bron, of deze nu afkomstig is van een string, een bestand of een externe URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Waarom dit belangrijk is:* `HTMLDocument` parseert de markup één keer, waardoor de converter kan werken met een genormaliseerde representatie in plaats van ruwe tekst. + +## Stap 2: Configureer `MarkdownSaveOptions` + +`MarkdownSaveOptions` stelt je in staat het uitvoerformaat en welke Markdown‑functies worden gegenereerd te bepalen. De bibliotheek ondersteunt twee formatters: + +* **DEFAULT** – standaard CommonMark‑compatibele Markdown. +* **GIT** – Git‑flavored Markdown (voegt tabellen, doorhalen, enz. toe). + +Voor de meeste versie‑beheerscenario's heeft de **GIT** formatter de voorkeur. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Alleen de benodigde functies inschakelen + +Je kunt de output fijn afstellen door specifieke feature‑flags in te schakelen. In dit voorbeeld behouden we **links** en **paragraphs** terwijl we afbeeldingen, tabellen en andere constructies uitschakelen. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Waarom dit belangrijk is:* Het beperken van functies verkleint de grootte van het gegenereerde bestand en voorkomt onverwachte Markdown‑elementen die downstream‑tools mogelijk niet ondersteunen. + +## Stap 3: Converteer het document + +Met de bron `HTMLDocument` en de geconfigureerde `MarkdownSaveOptions` is de conversie één enkele aanroep van `Converter.convert`. Geef een absoluut of relatief pad op voor het uitvoerbestand. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Na afloop van de aanroep bevat `output.md` de Markdown‑representatie van de oorspronkelijke HTML. + +## Volledig script dat je vandaag kunt uitvoeren + +Hieronder staat het volledige, zelfstandige script dat alle vorige stappen omvat. Sla het op als `html_to_md.py` en voer `python html_to_md.py` uit. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Verwachte output (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +De output komt overeen met de oorspronkelijke HTML‑structuur, terwijl alleen de functies die we hebben ingeschakeld (links, paragraphs en lists) worden weergegeven. + +## Veelvoorkomende randgevallen afhandelen + +### Ontbrekende of verkeerd gevormde `href` attributen + +Als een ``‑tag geen geldige `href` heeft, voegt de converter de linktekst in zonder een URL. Om de leesbaarheid te behouden, wil je de Markdown mogelijk post‑processen: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Grote HTML‑bestanden converteren + +Voor HTML‑bestanden van meerdere megabytes, stream je de invoer om te voorkomen dat de volledige markup in het geheugen wordt geladen: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Het conversieproces zelf blijft ongewijzigd omdat `HTMLDocument` de brongrootte abstraheert. + +## Alternatieve formatters + +Als je liever gewone CommonMark dan Git‑flavored output wilt, schakel dan de formatter om: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Dit levert een meer minimalistisch Markdown‑bestand op, handig wanneer je platformen target die Git‑extensies niet ondersteunen. + +## Gerelateerde taken die je later kunt verkennen + +* **Convert Markdown back to HTML** – nuttig voor het previewen van documentatie. +* **Export HTML to PDF** – een andere veelvoorkomende workflow die gerelateerd is aan **html to markdown conversion**. +* **Batch process a folder of HTML files** – doorloop bestanden en hergebruik dezelfde `MarkdownSaveOptions`‑instantie. + +Al deze taken volgen hetzelfde patroon: maak een bron‑document, configureer de save‑options, en roep `Converter.convert` aan. + +## Conclusie + +Je weet nu hoe je **HTML naar Markdown kunt converteren** in Python, hoe je **HTML als Markdown kunt opslaan** met precieze functieregeling, en waarom het kiezen van de juiste formatter belangrijk is voor downstream‑tools. Het voorbeeld toont een schone, herbruikbare aanpak die werkt voor enkele strings, bestanden of URL’s, en bevat tips voor het afhandelen van ontbrekende links en grote invoer. + +Voel je vrij om te experimenteren met extra `MarkdownSaveOptions.Features` (bijv. `IMAGE`, `TABLE`) om de output af te stemmen op de behoeften van je project. Als je deze gids nuttig vond, deel hem dan met teamgenoten of link ernaar vanuit je projectdocumentatie. Veel plezier met converteren! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/dutch/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..e19b6aa3b3 --- /dev/null +++ b/html/dutch/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,213 @@ +--- +category: general +date: 2026-10-02 +description: Leer hoe je een SVG‑document maakt in Python, SVG opslaat naar een bestand + en een SVG‑afbeelding exporteert met een kort, compleet script. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: nl +lastmod: 2026-10-02 +og_description: Maak een SVG-document in Python en exporteer een SVG-afbeelding met + deze praktische tutorial. Volg het script, sla de SVG op in een bestand en gebruik + de vectorafbeelding direct opnieuw. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Maak een SVG-document in Python – stapsgewijze handleiding +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Hoe een SVG-document te maken en het als afbeelding te exporteren in Python +url: /nl/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe een SVG-document te maken en te exporteren als afbeelding in Python + +Als je **een SVG-document** programmatisch moet maken, laat deze tutorial je precies zien hoe je dat doet met Python. Je ziet een compleet script dat een eenvoudige cirkel maakt, de SVG opslaat naar een bestand, en een exporteerbare SVG-afbeelding produceert die je overal kunt insluiten. + +Het genereren van schaalbare vectorafbeeldingen vanuit code verwijdert de handmatige inspanning van het tekenen van vormen in een GUI-editor. Aan het einde van deze gids kun je SVG-creatie integreren in data‑visualisatie‑pijplijnen, geautomatiseerde rapportgeneratoren, of elk project dat scherpe, resolutie‑onafhankelijke graphics vereist. + +## Vereisten + +- Python 3.8 of nieuwer geïnstalleerd +- De `svgwrite`-bibliotheek (installeren met `pip install svgwrite`) +- Schrijfrechten voor de map waarin de SVG wordt opgeslagen + +Deze vereisten houden het voorbeeld lichtgewicht en compatibel met de meeste omgevingen. + +## Stap 1: Installeer en importeer de SVG-bibliotheek + +De eerste stap is het toevoegen van de externe bibliotheek die een handige API biedt voor het maken van SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstraheert de XML-structuur van een SVG‑bestand, zodat je je kunt concentreren op geometrie in plaats van ruwe markup. + +## Stap 2: Maak een SVG-documentobject + +Nu kun je **een SVG-document** maken door `svgwrite.Drawing` te instantieren. Dit object vertegenwoordigt het root‑element `` en bevat alle daaropvolgende vormen. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Het argument `size` definieert de gerenderde pixelafmetingen, terwijl `viewBox` een coördinatensysteem vastlegt dat overeenkomt met de geometrie die je later definieert. + +## Stap 3: Voeg een cirkelelement toe + +Een cirkel wordt gedefinieerd door zijn middelpunt (`cx`, `cy`) en straal (`r`). Gebruik de `circle`‑helper om deze attributen toe te voegen. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +De cirkel bevindt zich in het midden van het 100 × 100‑canvas, met een marge van 10 pixel aan elke kant. Pas `fill` en `stroke` aan om overeen te komen met je ontwerpstijl. + +## Stap 4: Sla de SVG op als bestand + +Met de grafiek samengesteld kun je **de SVG opslaan naar een bestand** met de `save`‑methode. Dit schrijft goed‑gevormde XML die browsers en vectorbewerkers begrijpen. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Het bestand `circle.svg` bevindt zich nu in de huidige werkmap. Je kunt het openen in een webbrowser, Inkscape, of elk hulpmiddel dat het SVG‑formaat ondersteunt. + +## Stap 5: Controleer de geëxporteerde SVG-afbeelding + +Open het opgeslagen bestand in een browser om de output te bevestigen. Je zou een gecentreerde cirkel moeten zien met de opgegeven kleuren. De ruwe XML ziet er als volgt uit: + +```xml + + + + +``` + +Omdat SVG vector‑gebaseerd is, kun je de afbeelding schalen zonder kwaliteitsverlies, waardoor het ideaal is voor responsieve webontwerpen of afdrukken met hoge resolutie. + +## Pro‑tip: Exporteer SVG als PNG of JPEG + +Als je een rasterversie nodig hebt, combineer dan het SVG‑bestand met een conversietool zoals **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Deze stap toont **het exporteren van een SVG-afbeelding** naar een bitmap‑formaat, nuttig wanneer downstream‑systemen SVG niet direct kunnen weergeven. + +## Veelvoorkomende variaties en randgevallen + +| Variatie | Hoe te behandelen | +|-----------|-------------------| +| Meerdere vormen | Roep `dwg.add()` aan voor elk nieuw element (rect, line, path). | +| Dynamische afmetingen | Bereken `size` en `viewBox` uit data voordat je `Drawing` maakt. | +| Tekstlabels | Gebruik `dwg.text("Label", insert=("10", "20"))` en style met `font_size` en `fill`. | +| Het document hergebruiken | Houd het `Drawing`‑object in het geheugen en roep `save()` aan wanneer je een bijgewerkt bestand nodig hebt. | +| Grote bestanden | Stream de output met `dwg.tostring()` en schrijf handmatig naar een bestandsobject om geheugenpieken te vermijden. | + +Het aanpakken van deze scenario's zorgt ervoor dat je **script om SVG te genereren** schaalt van eenvoudige iconen tot complexe diagrammen. + +## Volledige scriptoverzicht + +Hieronder staat het volledige, uitvoerbare voorbeeld dat alle stappen en de optionele conversie bevat: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Het uitvoeren van dit script produceert `circle.svg` en, als `cairosvg` geïnstalleerd is, `circle.png`. Beide bestanden zijn klaar voor opname in webpagina's, rapporten, of verdere verwerking. + +## Conclusie + +Je weet nu hoe je **een SVG-document** in Python kunt **maken**, **SVG naar een bestand kunt opslaan**, en **SVG-afbeeldingen kunt exporteren** voor bredere toepassing. Het voorbeeld behandelt de essentiële API‑aanroepen, legt uit waarom elke stap belangrijk is, en biedt uitbreidingen voor complexere graphics. + +Verken vervolgens extra **SVG Python‑tutorials** zoals het tekenen van paden, toepassen van verlopen, en animeren van elementen. Het integreren van deze technieken stelt je in staat om dynamische, data‑gedreven vectorafbeeldingen direct vanuit je Python‑applicaties te genereren. Veel programmeerplezier! + +## Wat moet je hierna leren? + +De volgende tutorials behandelen nauw verwante onderwerpen die voortbouwen op de technieken die in deze gids worden getoond. Elke bron bevat volledige werkende code‑voorbeelden met stapsgewijze uitleg om je te helpen extra API‑functies onder de knie te krijgen en alternatieve implementatie‑benaderingen in je eigen projecten te verkennen. + +- [SVG-documenten maken en beheren in Aspose.HTML voor Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [SVG-document opslaan in Aspose.HTML voor Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg naar png java – SVG converteren naar afbeelding met Aspose.HTML voor Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/dutch/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..cabe0b6654 --- /dev/null +++ b/html/dutch/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,236 @@ +--- +category: general +date: 2026-10-02 +description: Leer hoe je een html‑document in Python kunt laden met HtmlSaveOptions + en streaming om grote html‑bestanden efficiënt te verwerken. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: nl +lastmod: 2026-10-02 +og_description: Laad HTML‑document in Python met HtmlSaveOptions en streaming. Deze + tutorial toont een complete, kant‑klaar oplossing voor grote HTML‑bestanden. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: HTML-document laden met streaming in Python – stapsgewijze handleiding +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Hoe een HTML-document te laden met streaming in Python +url: /nl/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe html‑document te laden met streaming in Python + +Als je **html-document** bestanden nodig hebt die enkele honderden megabytes of groter zijn, loop je snel tegen geheugen‑gebruik problemen aan. Deze gids toont je een complete, kant‑klaar oplossing die **HTML streaming** gebruikt om het geheugenverbruik laag te houden terwijl je nog steeds volledige toegang tot de inhoud van het document krijgt. + +Je leert hoe je `HtmlSaveOptions` configureert, streaming inschakelt en het verwerkte bestand opslaat — alles in slechts drie beknopte stappen. Er zijn geen externe tools nodig buiten het standaard `aspose.html` Python‑pakket, waardoor de aanpak ideaal is voor batch‑taken, server‑side pipelines of lokale scripts die **grote HTML‑bestanden** verwerken. + +## Vereisten + +* Python 3.8 of nieuwer geïnstalleerd. +* De `aspose.html` bibliotheek (`pip install aspose-html`) – deze levert `HTMLDocument` en `HtmlSaveOptions`. +* Een map die het grote HTML‑bestand bevat waarmee je wilt werken (bijv. `large.html`). + +Deze vereisten zijn minimaal, zodat je je kunt concentreren op de kernlogica van het efficiënt laden van een HTML‑document. + +## Stap 1: Laad het HTML‑document + +De eerste handeling is het aanmaken van een `HTMLDocument`‑instantie die naar het bronbestand wijst. Dit object vertegenwoordigt de **load html document**‑operatie en parseert de markup lui, wat essentieel is voor het verwerken van grote bestanden. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Waarom dit belangrijk is:** +Het aanmaken van het `HTMLDocument`‑object leest niet meteen het volledige bestand in het geheugen. In plaats daarvan wordt een streaming‑parser voorbereid die gegevens van de schijf haalt wanneer dat nodig is. Dit ontwerp laat je werken met bestanden die groter zijn dan het RAM‑geheugen van je machine. + +## Stap 2: Streaming inschakelen met HtmlSaveOptions + +Om de geheugenvoetafdruk laag te houden terwijl je het document bewerkt of opslaat, moet je de streaming‑modus inschakelen op `HtmlSaveOptions`. Dit secundaire sleutelwoord, **HtmlSaveOptions**, bepaalt hoe de bibliotheek het uitvoerbestand schrijft. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Waarom streaming inschakelen?** +Wanneer `enable_streaming` op `True` staat, schrijft de bibliotheek de output in stukjes in plaats van het volledige resultaat in het geheugen te bufferen. Dit is cruciaal wanneer je later **save the document** of transformaties uitvoert op **large HTML files**. + +## Stap 3: Sla het document op met de geconfigureerde opties + +Nu streaming actief is, kun je de verwerkte inhoud veilig naar een nieuw bestand schrijven. De `save`‑methode respecteert de `HtmlSaveOptions` die we hebben geconfigureerd, waardoor de bewerking geheugen‑efficiënt blijft. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Wat er achter de schermen gebeurt:** +De `save`‑aanroep streamt de HTML‑markup naar `large_out.html` stukje voor stukje. Omdat het document is geladen met de streaming‑parser, werkt de volledige pijplijn — van laden tot opslaan — met een constante, lage geheugengebruik. + +## Volledig werkend voorbeeld + +Door de drie stappen samen te voegen krijg je een compacte script die je direct vanaf de commandoregel kunt uitvoeren: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Verwachte output** + +Wanneer je het script (`python load_html_document_streaming.py`) uitvoert, zie je: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Het bestand `large_out.html` zal een getrouwe kopie van het origineel zijn, maar het werd verwerkt zonder ooit het volledige bestand in RAM te laden. + +## Veelgestelde vragen en edge‑case handling + +### Werkt dit met HTML‑bestanden die externe bronnen bevatten (afbeeldingen, CSS, scripts)? + +Ja. De streaming‑parser behandelt externe verwijzingen als gewone attributen. Het **downloadt** de bronnen niet tenzij je dit expliciet vraagt. Als je die bronnen wilt insluiten, kun je extra API‑s van `aspose.html` gebruiken nadat het document is geladen. + +### Wat als het bronbestand corrupt is of geen goed gevormde HTML bevat? + +`HTMLDocument` probeert zich te herstellen van kleine fouten, maar ernstige misvormingen veroorzaken een uitzondering. Plaats de laadstap in een `try/except`‑blok om dergelijke gevallen netjes af te handelen: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Kan ik de DOM wijzigen vóór het opslaan? + +Absoluut. Na het laden heb je volledige toegang tot de DOM‑boom (`html_doc.dom`). Je kunt knooppunten invoegen, elementen verwijderen of attributen aanpassen, en vervolgens `save` aanroepen terwijl streaming nog steeds ingeschakeld is. Het geheugengebruik blijft laag omdat wijzigingen incrementeel worden toegepast. + +### Heeft streaming invloed op de output‑kwaliteit? + +Nee. De gestreamde output is byte‑voor‑byte identiek aan wat je zou krijgen met een niet‑gestreamde save, mits je geen DOM‑wijzigingen hebt aangebracht. Streaming verandert alleen hoe de data wordt geschreven, niet wat er wordt geschreven. + +## Prestati​tip: meet geheugenverbruik + +Als je wilt verifiëren dat streaming daadwerkelijk het geheugenverbruik verlaagt, kun je de `psutil`‑bibliotheek gebruiken: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Je ziet doorgaans slechts een paar megabytes RAM‑gebruik, zelfs voor 500 MB HTML‑bestanden. + +## Conclusie + +In deze tutorial heb je geleerd hoe je **html-document** efficiënt kunt laden in Python door: + +1. Een `HTMLDocument` te instantieren om het bestand lui te parseren. +2. `HtmlSaveOptions` te configureren met `enable_streaming = True` voor low‑memory writes. +3. Het document op te slaan terwijl de output naar schijf wordt gestreamd. + +Deze drie stappen bieden een robuust patroon voor het verwerken van **large HTML files** met **Python HTML processing**‑technieken. Vanaf hier kun je het script uitbreiden om de DOM te wijzigen, data te extraheren of tientallen bestanden in batch te verwerken — altijd met voorspelbaar geheugengebruik. + +**Volgende stappen** + +* Verken de `aspose.html` DOM‑API om tabellen, links of afbeeldingen te extraheren. +* Combineer deze aanpak met multithreading om meerdere bestanden parallel te verwerken. +* Kijk naar `HtmlLoadOptions` als je de tekencodering of andere parse‑nuances wilt regelen. + +Happy coding, en geniet van de geheugen‑vriendelijke manier om **html-document** op schaal te laden! + +## Wat moet je hierna leren? + +De volgende tutorials behandelen nauw verwante onderwerpen die voortbouwen op de technieken die in deze gids worden gedemonstreerd. Elke bron bevat complete werkende code‑voorbeelden met stap‑voor‑stap uitleg om je te helpen extra API‑functies onder de knie te krijgen en alternatieve implementatie‑benaderingen in je eigen projecten te verkennen. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..e872b494da --- /dev/null +++ b/html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: en +lastmod: 2026-10-02 +og_description: convert HTML to Markdown in Python with practical code, formatter + options, and feature flags. Follow this guide to save HTML as Markdown quickly. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Convert HTML to Markdown in Python – full tutorial +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: How to convert HTML to Markdown in Python – step‑by‑step guide +url: /python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to convert HTML to Markdown in Python – step‑by‑step guide + +If you need to **convert HTML to Markdown**, this guide shows you a complete, runnable solution in Python. You’ll see how to **save HTML as Markdown**, pick the right formatter, and enable only the features you care about. + +Converting HTML to Markdown is a common task when you want lightweight documentation, static‑site content, or version‑controlled text files. This tutorial covers everything from installing the library to handling edge cases, so you can apply the technique to any HTML source. + +## Prerequisites + +Before you start, make sure you have: + +* Python 3.8 or newer installed. +* `pip` access to install third‑party packages. +* Basic familiarity with HTML tags and Markdown syntax. + +No additional system dependencies are required because the conversion library is pure Python. + +## Install the GroupDocs Conversion library + +The code sample uses the **GroupDocs.Conversion** Python package, which provides `HTMLDocument`, `MarkdownSaveOptions`, and `Converter`. Install it with: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** Use a virtual environment (`python -m venv venv`) to keep the package isolated from other projects. + +## Step 1: Create an `HTMLDocument` from a string + +The first step is to wrap your raw HTML in an `HTMLDocument` instance. This object abstracts the source, whether it comes from a string, a file, or a remote URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Why this matters:* `HTMLDocument` parses the markup once, allowing the converter to work with a normalized representation instead of raw text. + +## Step 2: Configure `MarkdownSaveOptions` + +`MarkdownSaveOptions` lets you control the output format and which Markdown features are emitted. The library supports two formatters: + +* **DEFAULT** – standard CommonMark‑compatible Markdown. +* **GIT** – Git‑flavored Markdown (adds tables, strikethrough, etc.). + +For most version‑control scenarios, the **GIT** formatter is preferred. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Enabling only the needed features + +You can fine‑tune the output by turning on specific feature flags. In this example we keep **links** and **paragraphs** while disabling images, tables, and other constructs. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Why this matters:* Limiting features reduces the size of the generated file and prevents unexpected Markdown elements that downstream tools might not support. + +## Step 3: Convert the document + +With the source `HTMLDocument` and the configured `MarkdownSaveOptions`, conversion is a single call to `Converter.convert`. Provide an absolute or relative path for the output file. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +After the call finishes, `output.md` contains the Markdown representation of the original HTML. + +## Full script you can run today + +Below is the complete, self‑contained script that incorporates all previous steps. Save it as `html_to_md.py` and run `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Expected output (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +The output matches the original HTML structure while exposing only the features we enabled (links, paragraphs, and lists). + +## Handling common edge cases + +### Missing or malformed `href` attributes + +If an `` tag lacks a valid `href`, the converter inserts the link text without a URL. To preserve readability, you may want to post‑process the Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Converting large HTML files + +For multi‑megabyte HTML files, stream the input to avoid loading the entire markup into memory: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +The conversion process itself remains unchanged because `HTMLDocument` abstracts away the source size. + +## Alternative formatters + +If you prefer plain CommonMark rather than Git‑flavored output, switch the formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +This yields a more minimal Markdown file, useful when you target platforms that do not support Git extensions. + +## Related tasks you might explore next + +* **Convert Markdown back to HTML** – useful for previewing documentation. +* **Export HTML to PDF** – another common **html to markdown conversion**‑adjacent workflow. +* **Batch process a folder of HTML files** – loop over files and reuse the same `MarkdownSaveOptions` instance. + +All of these follow the same pattern: create a source document, configure save options, and call `Converter.convert`. + +## Conclusion + +You now know how to **convert HTML to Markdown** in Python, how to **save HTML as Markdown** with precise feature control, and why selecting the right formatter matters for downstream tools. The example demonstrates a clean, reusable approach that works for single strings, files, or URLs, and it includes tips for handling missing links and large inputs. + +Feel free to experiment with additional `MarkdownSaveOptions.Features` (e.g., `IMAGE`, `TABLE`) to tailor the output to your project's needs. If you found this guide helpful, share it with teammates or link to it from your project documentation. Happy converting! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/og-image.png b/html/english/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e2dd626d6f80b20450752bbaf587cf20be2e5fdb GIT binary patch literal 44296 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%0DUjoXrL5%b|R3)aqT(P2^8=JfovP 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 HK6?2-p(i(R literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..534e152790 --- /dev/null +++ b/html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,216 @@ +--- +category: general +date: 2026-10-02 +description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: en +lastmod: 2026-10-02 +og_description: Create SVG document in Python and export SVG image with this practical + tutorial. Follow the script, save SVG to file, and reuse the vector graphic instantly. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Create SVG document in Python – step‑by‑step guide +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: How to create SVG document and export it as an image in Python +url: /python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to create SVG document and export it as an image in Python + +If you need to **create SVG document** programmatically, this tutorial shows you exactly how to do it with Python. You’ll see a complete script that builds a simple circle, saves the SVG to file, and produces an exportable SVG image you can embed anywhere. + +Generating scalable vector graphics from code removes the manual effort of drawing shapes in a GUI editor. By the end of this guide you can integrate SVG creation into data‑visualisation pipelines, automated report generators, or any project that requires crisp, resolution‑independent graphics. + +## Prerequisites + +Before you start, ensure you have: + +- Python 3.8 or newer installed +- The `svgwrite` library (install with `pip install svgwrite`) +- Write permission to the directory where the SVG will be saved + +These requirements keep the example lightweight and compatible with most environments. + +## Step 1: Install and import the SVG library + +The first step is to add the third‑party library that provides a convenient API for SVG creation. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstracts the XML structure of an SVG file, letting you focus on geometry instead of raw markup. + +## Step 2: Create an SVG document object + +Now you can **create SVG document** by instantiating `svgwrite.Drawing`. This object represents the root `` element and holds all subsequent shapes. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +The `size` argument defines the rendered pixel dimensions, while `viewBox` establishes a coordinate system that matches the geometry you’ll define later. + +## Step 3: Add a circle element + +A circle is defined by its centre (`cx`, `cy`) and radius (`r`). Use the `circle` helper to attach these attributes. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +The circle sits in the middle of the 100 × 100 canvas, leaving a 10‑pixel margin on each side. Adjust `fill` and `stroke` to match your design language. + +## Step 4: Save the SVG to file + +With the graphic assembled, you can **save SVG to file** using the `save` method. This writes well‑formed XML that browsers and vector editors understand. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +The file `circle.svg` now resides in the current working directory. You can open it in a web browser, Inkscape, or any tool that supports the SVG format. + +## Step 5: Verify the exported SVG image + +Open the saved file in a browser to confirm the output. You should see a centered circle with the specified colors. The raw XML looks like this: + +```xml + + + + +``` + +Because SVG is vector‑based, you can scale the image without loss of quality, making it ideal for responsive web designs or high‑resolution print. + +## Pro tip: Export SVG as PNG or JPEG + +If you need a raster version, combine the SVG file with a conversion tool such as **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +This step demonstrates **export SVG image** to a bitmap format, useful when downstream systems cannot render SVG directly. + +## Common variations and edge cases + +| Variation | How to handle | +|-----------|---------------| +| Multiple shapes | Call `dwg.add()` for each new element (rect, line, path). | +| Dynamic dimensions | Compute `size` and `viewBox` from data before creating `Drawing`. | +| Text labels | Use `dwg.text("Label", insert=("10", "20"))` and style with `font_size` and `fill`. | +| Re‑using the document | Keep the `Drawing` object in memory and call `save()` whenever you need an updated file. | +| Large files | Stream the output using `dwg.tostring()` and write to a file object manually to avoid memory spikes. | + +Addressing these scenarios ensures your **how to generate SVG** script scales from simple icons to complex diagrams. + +## Full script recap + +Below is the complete, runnable example that incorporates all steps and optional conversion: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Running this script produces `circle.svg` and, if `cairosvg` is installed, `circle.png`. Both files are ready for inclusion in web pages, reports, or further processing. + +## Conclusion + +You now know how to **create SVG document** in Python, **save SVG to file**, and **export SVG image** for broader use. The example covers the essential API calls, explains why each step matters, and offers extensions for more complex graphics. + +Next, explore additional **SVG Python tutorial** topics such as drawing paths, applying gradients, and animating elements. Integrating these techniques will let you generate dynamic, data‑driven vector graphics directly from your Python applications. Happy coding! + + +## What Should You Learn Next? + + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/og-image.png b/html/english/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..4b060021073d0f5a82c473096228c71047dfccbc GIT binary patch literal 53135 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 ZGD?6n;cyHe` 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 literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/english/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..8aa6e25634 --- /dev/null +++ b/html/english/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-10-02 +description: Learn how to load html document in Python with HtmlSaveOptions and streaming + to process large html files efficiently. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: en +lastmod: 2026-10-02 +og_description: Load html document in Python using HtmlSaveOptions and streaming. + This tutorial shows a complete, ready‑to‑run solution for large HTML files. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Load html document with streaming in Python – step‑by‑step guide +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: How to load html document with streaming in Python +url: /python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to load html document with streaming in Python + +If you need to **load html document** files that are several hundred megabytes or larger, you’ll quickly run into memory‑usage problems. This guide shows you a complete, ready‑to‑run solution that uses **HTML streaming** to keep memory consumption low while still giving you full access to the document’s contents. + +You’ll learn how to configure `HtmlSaveOptions`, enable streaming, and save the processed file—all in just three concise steps. No external tools are required beyond the standard `aspose.html` Python package, making the approach ideal for batch jobs, server‑side pipelines, or local scripts that handle **large HTML files**. + +## Prerequisites + +Before you start, make sure you have: + +* Python 3.8 or newer installed. +* The `aspose.html` library (`pip install aspose-html`) – this provides `HTMLDocument` and `HtmlSaveOptions`. +* A directory that contains the large HTML file you want to work with (e.g., `large.html`). + +These requirements are minimal, so you can focus on the core logic of loading an HTML document efficiently. + +## Step 1: Load the HTML document + +The first operation is to create an `HTMLDocument` instance that points to the source file. This object represents the **load html document** operation and parses the markup lazily, which is essential for handling big files. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Why this matters:** +Creating the `HTMLDocument` object does not immediately read the whole file into memory. Instead, it prepares a streaming parser that will pull data from disk as needed. This design lets you work with files that exceed your machine’s RAM. + +## Step 2: Enable streaming with HtmlSaveOptions + +To keep the memory footprint low while you manipulate or save the document, you must enable the streaming mode on `HtmlSaveOptions`. This secondary keyword, **HtmlSaveOptions**, controls how the library writes the output file. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Why enable streaming?** +When `enable_streaming` is set to `True`, the library writes the output in chunks rather than buffering the entire result in memory. This is crucial when you later **save the document** or perform transformations on **large HTML files**. + +## Step 3: Save the document with the configured options + +Now that streaming is active, you can safely write the processed content to a new file. The `save` method respects the `HtmlSaveOptions` we configured, ensuring that the operation stays memory‑efficient. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**What happens behind the scenes:** +The `save` call streams the HTML markup to `large_out.html` piece by piece. Because the document was loaded with the streaming parser, the entire pipeline—from load to save—operates with a constant, low memory usage. + +## Full working example + +Putting the three steps together gives you a compact script you can run directly from the command line: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Expected output** + +When you run the script (`python load_html_document_streaming.py`), you should see: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +The `large_out.html` file will be a faithful copy of the original, but it was processed without ever loading the entire file into RAM. + +## Common questions and edge‑case handling + +### Does this work with HTML files that contain external resources (images, CSS, scripts)? + +Yes. The streaming parser treats external references as ordinary attributes. It does **not** download the resources unless you explicitly request them. If you need to embed those resources, you can use additional APIs from `aspose.html` after the document is loaded. + +### What if the source file is corrupted or not well‑formed HTML? + +`HTMLDocument` will attempt to recover from minor errors, but severe malformations raise an exception. Wrap the load step in a `try/except` block to handle such cases gracefully: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Can I modify the DOM before saving? + +Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). You can insert nodes, remove elements, or alter attributes, and then call `save` with streaming still enabled. The memory usage will stay low because changes are applied incrementally. + +### Does streaming affect the output quality? + +No. The streamed output is byte‑for‑byte identical to what you would get from a non‑streaming save, assuming you haven’t made any DOM modifications. Streaming only changes how the data is written, not what is written. + +## Performance tip: measure memory usage + +If you want to verify that streaming really reduces memory consumption, you can use the `psutil` library: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +You’ll typically see only a few megabytes of RAM used, even for 500 MB HTML files. + +## Conclusion + +In this tutorial you learned how to **load html document** efficiently in Python by: + +1. Instantiating `HTMLDocument` to parse the file lazily. +2. Configuring `HtmlSaveOptions` with `enable_streaming = True` for low‑memory writes. +3. Saving the document while streaming the output to disk. + +These three steps give you a robust pattern for processing **large HTML files** using **Python HTML processing** techniques. From here you can extend the script to modify the DOM, extract data, or batch‑process dozens of files—all while keeping memory usage predictable. + +**Next steps** + +* Explore the `aspose.html` DOM API to extract tables, links, or images. +* Combine this approach with multithreading to process multiple files in parallel. +* Look into `HtmlLoadOptions` if you need to control character encoding or other parsing nuances. + +Happy coding, and enjoy the memory‑friendly way to **load html document** at scale! + + +## What Should You Learn Next? + + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/python/general/how-to-load-html-document-with-streaming-in-python/og-image.png b/html/english/python/general/how-to-load-html-document-with-streaming-in-python/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..475e1b7c33515dcadefb668c2772502faa179f1a GIT binary patch literal 45043 zcma&O2UJsCw=Rqo6%iBx0Rd3~=}J|qposL|oAerxUP6ekf(VNAE+D=4UZeEhYasLv zA@mXm`4{?r_nvd_8F%~{8QF2Ov-eta&HBt|>93?9MSO$$1_1#9vGm*5Dg*?V3ke7= zx?Z~o&is0~K}0}MP%ZshT+JQ1fpXEh--`dW{o?uL_22QN7a162t~o@th**V|Tg6t_ z;IMf$0ue(h{`@1AH8r=dIfy^1yzhz-<4n7|8Cf%b>-#*;b7wE9qNb##q@-kbJU%{R zQSLhB+EGC#Id~WW!LFG&#h))17|stLK9HUtUcS6`et7WU^7(<3^n73h*REYSKV0@X z|0K95asK(iDlF^@I4W5!Ixky^s~B8i3FBsoQ|*Y|@;Sc~-pXI&BraS!CY%P^@#mL) z<&4&22T#r~6R`bz>OVIl_%jC9;rqWEluUGjxmm&-8`I_f3cflq>wg6J|B@9|$p3#?-7$Tk+AyqeO)F8V3{0)>a>{R+s~&H}J5uF3 zh~tWR6aK8pOESs7EA?mMmf6+^ay)8=d@4+4Dt2Sx*UuO1r!I7;kVE<3Q;ctKvW6+1 z-;sd8{2TM1rTllXEoBzWt29Ti3OQQ#I}a6oa_h-c+ffqZ?DlF0Lh8$mnI)4*7U$)2 zVcC8Csc8Vr`9pBzv%b5sqT4s0fw@0;@R<5?tno2(C<7Dt!PCSK!Iq?bXY3C?|M@rR zH|}$V|L^MaKZ@M)biwo=e<$qh&#rzx%$aM)Tmx2{REdqb;C=Jbt6}fb!r<|79RW8t zJMy{p#aZhyJ_GrhDhT}J8YToMSS2X*{w{b9(AMaHfE#AwNy$IAS{By@jCHP*eZ4ut z=Q|yVQNkrn&w+~`JQzwG_u94YFc(C7InR_D4lR7Bwutcv za#b~-F0|ZSK58xxD3v|#CC2s|Yw-6tDYB4Ddhi%q%fH^QkaU8t-zMppaISd2s}^}T z!cdwWRbA3gN7a?y%ZK=pDW|y+qIddyxR9qc3SC_7kSE!^#4%oSr zF`Z#V4-$=s-9ppcf{R}(Cpc%iw^NdjhUOHgeU%$DcQY-&HS#IF-Gorvov@RgosGL7 za#J@&>m=t1%Sd`~n=NfF;Uot}xUYfvb=zV`myH>-TU0K-ZjIGhs2-Q0wI6S}N}J2h z`9!Fy#(lQ6BUjD{V#Bk;kW-mN(d`v+Jf3zka+m8Y_nC{B#u;<359#fs`s>RDY!Mv~ zCELsP;>7E_)dy9$?Q)XEW8{3Uc&4G+M!Xr93(}c?)Oat$JJ|9wrmG_&1U%p6Mog;g zPxSLdDa6<5xP)xfHh{NN)F8Cw%~f}S!AJ7IikR+`cC_8URQPSh6n}a@CVoC%E<(5c zQB50on|R)Z;ggllGFTu`{KN>1=@fd|ltRYE3MnEo!TlIJJ+2qmDYPHuwxM~tyUsX4 zVe@U>OXB{N&chPK?o+9y730+vW2*a%B=&||J!<~?edaDmW;=mh+MKC*OqV%?4Kp-d z1UdW|WUfKXRo2c68L{l2>^(~}4PVagyNNeUVau z0>5o{ym&e0(^r?o>-;A46>Fl|!pD~Fk-qA4B(m#M^D-kionjYd$rf^DgM6zra)JCP z+9^F(FRAA4yJpfwl05V|n~#8EoARKC2R_k+UwL62RZQm<)HRiLx)CyWOs}CQ#_UtL zbu+kiuXM|Xp)LrSt1!{T!Jg+C#HD>A+m4-Pb+psD`esZ4Hq4!zf=fwU65)BdKcvtp zmjesrCaTFW*L5e1GL%+3-IqM}4NJ~#;%0AgU6YMWg4i;N7z!WCw<}EzoW)?+Yd^Bu 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 E00aPvt^fc4 literal 0 HcmV?d00001 diff --git a/html/french/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/french/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..60d950877e --- /dev/null +++ b/html/french/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Convertir le HTML en Markdown en Python avec un exemple complet. Apprenez + comment enregistrer le HTML en tant que Markdown, choisir les formatteurs et activer + des fonctionnalités spécifiques. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: fr +lastmod: 2026-10-02 +og_description: Convertir le HTML en Markdown avec Python grâce à du code pratique, + des options de formatage et des indicateurs de fonctionnalités. Suivez ce guide + pour enregistrer le HTML en Markdown rapidement. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Convertir le HTML en Markdown avec Python – tutoriel complet +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Comment convertir du HTML en Markdown avec Python – guide étape par étape +url: /fr/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment convertir du HTML en Markdown avec Python – guide étape par étape + +Si vous devez **convertir du HTML en Markdown**, ce guide vous montre une solution complète et exécutable en Python. Vous verrez comment **enregistrer du HTML en Markdown**, choisir le bon formateur et activer uniquement les fonctionnalités qui vous intéressent. + +Convertir du HTML en Markdown est une tâche courante lorsque vous souhaitez une documentation légère, du contenu pour site statique ou des fichiers texte sous contrôle de version. Ce tutoriel couvre tout, de l'installation de la bibliothèque à la gestion des cas limites, afin que vous puissiez appliquer la technique à n'importe quelle source HTML. + +## Prérequis + +* Python 3.8 ou version plus récente installé. +* Accès à `pip` pour installer des packages tiers. +* Familiarité de base avec les balises HTML et la syntaxe Markdown. + +Aucune dépendance système supplémentaire n'est requise car la bibliothèque de conversion est purement Python. + +## Installer la bibliothèque GroupDocs Conversion + +L'exemple de code utilise le package Python **GroupDocs.Conversion**, qui fournit `HTMLDocument`, `MarkdownSaveOptions` et `Converter`. Installez-le avec : + +```bash +pip install groupdocs-conversion +``` + +> **Astuce :** Utilisez un environnement virtuel (`python -m venv venv`) pour garder le package isolé des autres projets. + +## Étape 1 : Créer un `HTMLDocument` à partir d'une chaîne + +La première étape consiste à encapsuler votre HTML brut dans une instance `HTMLDocument`. Cet objet abstrait la source, qu'elle provienne d'une chaîne, d'un fichier ou d'une URL distante. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Pourquoi c'est important :* `HTMLDocument` analyse le balisage une fois, permettant au convertisseur de travailler avec une représentation normalisée plutôt qu'avec du texte brut. + +## Étape 2 : Configurer `MarkdownSaveOptions` + +`MarkdownSaveOptions` vous permet de contrôler le format de sortie et les fonctionnalités Markdown émises. La bibliothèque prend en charge deux formateurs : + +* **DEFAULT** – Markdown standard compatible CommonMark. +* **GIT** – Markdown de type Git (ajoute des tableaux, du texte barré, etc.). + +Pour la plupart des scénarios de contrôle de version, le formateur **GIT** est préféré. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Activer uniquement les fonctionnalités nécessaires + +Vous pouvez affiner la sortie en activant des indicateurs de fonctionnalités spécifiques. Dans cet exemple, nous conservons les **liens** et les **paragraphes** tout en désactivant les images, les tableaux et d'autres constructions. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Pourquoi c'est important :* Limiter les fonctionnalités réduit la taille du fichier généré et empêche l'apparition d'éléments Markdown inattendus que les outils en aval pourraient ne pas prendre en charge. + +## Étape 3 : Convertir le document + +Avec le `HTMLDocument` source et les `MarkdownSaveOptions` configurés, la conversion se fait en un seul appel à `Converter.convert`. Fournissez un chemin absolu ou relatif pour le fichier de sortie. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Après la fin de l'appel, `output.md` contient la représentation Markdown du HTML original. + +## Script complet que vous pouvez exécuter dès aujourd'hui + +Ci-dessous le script complet et autonome qui intègre toutes les étapes précédentes. Enregistrez-le sous le nom `html_to_md.py` et exécutez `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Sortie attendue (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +La sortie correspond à la structure HTML originale tout en exposant uniquement les fonctionnalités que nous avons activées (liens, paragraphes et listes). + +## Gestion des cas limites courants + +### Attributs `href` manquants ou malformés + +Si une balise `` n'a pas de `href` valide, le convertisseur insère le texte du lien sans URL. Pour préserver la lisibilité, vous pouvez post‑traiter le Markdown : + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Conversion de gros fichiers HTML + +Pour les fichiers HTML de plusieurs mégaoctets, diffusez l'entrée afin d'éviter de charger tout le balisage en mémoire : + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Le processus de conversion lui‑-même reste inchangé car `HTMLDocument` abstrait la taille de la source. + +## Formateurs alternatifs + +Si vous préférez le CommonMark simple plutôt que la sortie de type Git, changez le formateur : + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Cela produit un fichier Markdown plus minimal, utile lorsque vous ciblez des plateformes qui ne supportent pas les extensions Git. + +## Tâches connexes que vous pourriez explorer ensuite + +* **Convertir le Markdown en HTML** – utile pour prévisualiser la documentation. +* **Exporter le HTML en PDF** – un autre flux de travail courant adjacent à la **conversion html to markdown**. +* **Traiter par lots un dossier de fichiers HTML** – parcourir les fichiers et réutiliser la même instance `MarkdownSaveOptions`. + +Toutes ces tâches suivent le même schéma : créer un document source, configurer les options de sauvegarde et appeler `Converter.convert`. + +## Conclusion + +Vous savez maintenant comment **convertir du HTML en Markdown** avec Python, comment **enregistrer du HTML en Markdown** avec un contrôle précis des fonctionnalités, et pourquoi le choix du bon formateur est important pour les outils en aval. L'exemple montre une approche propre et réutilisable qui fonctionne pour des chaînes uniques, des fichiers ou des URL, et il inclut des astuces pour gérer les liens manquants et les gros fichiers d'entrée. + +N'hésitez pas à expérimenter avec des `MarkdownSaveOptions.Features` supplémentaires (par ex., `IMAGE`, `TABLE`) pour adapter la sortie aux besoins de votre projet. Si vous avez trouvé ce guide utile, partagez‑le avec vos collègues ou créez un lien vers celui‑ci depuis la documentation de votre projet. Bonne conversion ! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/french/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..991eba535c --- /dev/null +++ b/html/french/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Apprenez à créer un document SVG en Python, à enregistrer le SVG dans + un fichier et à exporter l'image SVG avec un script court et complet. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: fr +lastmod: 2026-10-02 +og_description: Créez un document SVG en Python et exportez l'image SVG avec ce tutoriel + pratique. Suivez le script, enregistrez le SVG dans un fichier et réutilisez le + graphique vectoriel instantanément. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Créer un document SVG en Python – guide étape par étape +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Comment créer un document SVG et l’exporter en tant qu’image en Python +url: /fr/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment créer un document SVG et l'exporter en tant qu'image en Python + +Si vous devez **créer un document SVG** de manière programmatique, ce tutoriel vous montre exactement comment le faire avec Python. Vous verrez un script complet qui crée un cercle simple, enregistre le SVG dans un fichier, et produit une image SVG exportable que vous pouvez intégrer n'importe où. + +Générer des graphiques vectoriels évolutifs à partir du code élimine l'effort manuel de dessin des formes dans un éditeur GUI. À la fin de ce guide, vous pourrez intégrer la création de SVG dans des pipelines de visualisation de données, des générateurs de rapports automatisés, ou tout projet nécessitant des graphiques nets et indépendants de la résolution. + +## Prérequis + +Avant de commencer, assurez‑vous d'avoir : + +- Python 3.8 ou version plus récente installé +- La bibliothèque `svgwrite` (installer avec `pip install svgwrite`) +- Permission d'écriture sur le répertoire où le SVG sera enregistré + +Ces exigences maintiennent l'exemple léger et compatible avec la plupart des environnements. + +## Étape 1 : Installer et importer la bibliothèque SVG + +La première étape consiste à ajouter la bibliothèque tierce qui fournit une API pratique pour la création de SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrait la structure XML d'un fichier SVG, vous permettant de vous concentrer sur la géométrie plutôt que sur le balisage brut. + +## Étape 2 : Créer un objet document SVG + +Vous pouvez maintenant **créer un document SVG** en instanciant `svgwrite.Drawing`. Cet objet représente l'élément racine `` et contient toutes les formes suivantes. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +L'argument `size` définit les dimensions en pixels rendues, tandis que `viewBox` établit un système de coordonnées qui correspond à la géométrie que vous définirez plus tard. + +## Étape 3 : Ajouter un élément cercle + +Un cercle est défini par son centre (`cx`, `cy`) et son rayon (`r`). Utilisez l'assistant `circle` pour ajouter ces attributs. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Le cercle se trouve au centre du canevas de 100 × 100, laissant une marge de 10 pixels de chaque côté. Ajustez `fill` et `stroke` pour correspondre à votre langage de conception. + +## Étape 4 : Enregistrer le SVG dans un fichier + +Une fois le graphique assemblé, vous pouvez **enregistrer le SVG dans un fichier** en utilisant la méthode `save`. Cela écrit un XML bien formé que les navigateurs et les éditeurs vectoriels comprennent. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Le fichier `circle.svg` se trouve maintenant dans le répertoire de travail actuel. Vous pouvez l'ouvrir dans un navigateur web, Inkscape, ou tout outil supportant le format SVG. + +## Étape 5 : Vérifier l'image SVG exportée + +Ouvrez le fichier enregistré dans un navigateur pour confirmer le résultat. Vous devriez voir un cercle centré avec les couleurs spécifiées. Le XML brut ressemble à ceci : + +```xml + + + + +``` + +Comme le SVG est basé sur des vecteurs, vous pouvez mettre à l'échelle l'image sans perte de qualité, ce qui le rend idéal pour les conceptions web réactives ou les impressions haute résolution. + +## Astuce : Exporter le SVG en PNG ou JPEG + +Si vous avez besoin d'une version raster, combinez le fichier SVG avec un outil de conversion tel que **CairoSVG** : + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Cette étape montre comment **exporter l'image SVG** vers un format bitmap, utile lorsque les systèmes en aval ne peuvent pas rendre le SVG directement. + +## Variations courantes et cas limites + +| Variation | Comment gérer | +|-----------|---------------| +| Formes multiples | Appelez `dwg.add()` pour chaque nouvel élément (rect, line, path). | +| Dimensions dynamiques | Calculez `size` et `viewBox` à partir des données avant de créer le `Drawing`. | +| Étiquettes de texte | Utilisez `dwg.text("Label", insert=("10", "20"))` et stylisez avec `font_size` et `fill`. | +| Réutiliser le document | Conservez l'objet `Drawing` en mémoire et appelez `save()` chaque fois que vous avez besoin d'un fichier mis à jour. | +| Fichiers volumineux | Diffusez la sortie en utilisant `dwg.tostring()` et écrivez dans un objet fichier manuellement pour éviter les pics de mémoire. | + +Gérer ces scénarios garantit que votre script **comment générer du SVG** s'adapte des icônes simples aux diagrammes complexes. + +## Récapitulatif du script complet + +Voici l'exemple complet et exécutable qui intègre toutes les étapes et la conversion optionnelle : + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +L'exécution de ce script produit `circle.svg` et, si `cairosvg` est installé, `circle.png`. Les deux fichiers sont prêts à être inclus dans des pages web, des rapports ou pour un traitement ultérieur. + +## Conclusion + +Vous savez maintenant comment **créer un document SVG** en Python, **enregistrer le SVG dans un fichier**, et **exporter l'image SVG** pour une utilisation plus large. L'exemple couvre les appels d'API essentiels, explique pourquoi chaque étape est importante, et propose des extensions pour des graphiques plus complexes. + +Ensuite, explorez d'autres sujets du **tutoriel SVG Python** tels que le tracé de chemins, l'application de dégradés et l'animation d'éléments. Intégrer ces techniques vous permettra de générer des graphiques vectoriels dynamiques et basés sur les données directement depuis vos applications Python. Bon codage ! + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s'appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code complets et fonctionnels avec des explications étape par étape pour vous aider à maîtriser des fonctionnalités d'API supplémentaires et explorer des approches d'implémentation alternatives dans vos propres projets. + +- [Créer et gérer des documents SVG dans Aspose.HTML pour Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Enregistrer un document SVG dans Aspose.HTML pour Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg en png java – Convertir SVG en image avec Aspose.HTML pour Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/french/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..22f10e0eca --- /dev/null +++ b/html/french/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-10-02 +description: Apprenez comment charger un document HTML en Python avec HtmlSaveOptions + et le streaming pour traiter efficacement de gros fichiers HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: fr +lastmod: 2026-10-02 +og_description: Charger un document HTML en Python en utilisant HtmlSaveOptions et + le streaming. Ce tutoriel montre une solution complète, prête à l'emploi, pour les + gros fichiers HTML. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Charger un document HTML avec le streaming en Python – guide étape par étape +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Comment charger un document HTML en streaming avec Python +url: /fr/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment charger un document HTML avec streaming en Python + +Si vous devez **charger des fichiers de document html** qui font plusieurs centaines de mégaoctets ou plus, vous rencontrerez rapidement des problèmes d’utilisation de la mémoire. Ce guide vous montre une solution complète, prête à l’emploi, qui utilise le **streaming HTML** pour maintenir une faible consommation de mémoire tout en vous donnant un accès complet au contenu du document. + +Vous apprendrez à configurer `HtmlSaveOptions`, activer le streaming et enregistrer le fichier traité — le tout en trois étapes concises. Aucun outil externe n’est requis au-delà du package Python standard `aspose.html`, ce qui rend l’approche idéale pour les travaux par lots, les pipelines côté serveur ou les scripts locaux qui manipulent des **grands fichiers HTML**. + +## Prérequis + +Avant de commencer, assurez‑vous d’avoir : + +* Python 3.8 ou une version plus récente installé. +* La bibliothèque `aspose.html` (`pip install aspose-html`) – elle fournit `HTMLDocument` et `HtmlSaveOptions`. +* Un répertoire contenant le gros fichier HTML avec lequel vous souhaitez travailler (par ex., `large.html`). + +Ces exigences sont minimales, vous permettant de vous concentrer sur la logique principale du chargement efficace d’un document HTML. + +## Étape 1 : Charger le document HTML + +La première opération consiste à créer une instance `HTMLDocument` qui pointe vers le fichier source. Cet objet représente l’opération **load html document** et analyse le balisage de façon paresseuse, ce qui est essentiel pour gérer de gros fichiers. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Pourquoi c’est important :** +La création de l’objet `HTMLDocument` ne lit pas immédiatement l’ensemble du fichier en mémoire. À la place, elle prépare un analyseur en streaming qui récupérera les données depuis le disque au fur et à mesure des besoins. Cette conception vous permet de travailler avec des fichiers qui dépassent la RAM de votre machine. + +## Étape 2 : Activer le streaming avec HtmlSaveOptions + +Pour garder une empreinte mémoire faible pendant que vous manipulez ou enregistrez le document, vous devez activer le mode streaming sur `HtmlSaveOptions`. Ce mot‑clé secondaire, **HtmlSaveOptions**, contrôle la façon dont la bibliothèque écrit le fichier de sortie. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Pourquoi activer le streaming ?** +Lorsque `enable_streaming` est défini sur `True`, la bibliothèque écrit la sortie par morceaux plutôt que de mettre en mémoire tampon le résultat complet. C’est crucial lorsque vous **save the document** ou effectuez des transformations sur des **large HTML files**. + +## Étape 3 : Enregistrer le document avec les options configurées + +Maintenant que le streaming est actif, vous pouvez écrire en toute sécurité le contenu traité dans un nouveau fichier. La méthode `save` respecte les `HtmlSaveOptions` que nous avons configurés, garantissant que l’opération reste efficace en mémoire. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Ce qui se passe en coulisses :** +L’appel `save` diffuse le balisage HTML vers `large_out.html` morceau par morceau. Parce que le document a été chargé avec l’analyseur en streaming, toute la chaîne — du chargement à l’enregistrement — fonctionne avec une utilisation mémoire constante et faible. + +## Exemple complet fonctionnel + +Assembler les trois étapes donne un script compact que vous pouvez exécuter directement depuis la ligne de commande : + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Sortie attendue** + +Lorsque vous exécutez le script (`python load_html_document_streaming.py`), vous devriez voir : + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Le fichier `large_out.html` sera une copie fidèle de l’original, mais il aura été traité sans jamais charger l’ensemble du fichier en RAM. + +## Questions fréquentes et gestion des cas limites + +### Cela fonctionne‑t‑il avec des fichiers HTML contenant des ressources externes (images, CSS, scripts) ? + +Oui. L’analyseur en streaming traite les références externes comme des attributs ordinaires. Il **ne** télécharge **pas** les ressources sauf si vous le demandez explicitement. Si vous devez incorporer ces ressources, vous pouvez utiliser les API supplémentaires de `aspose.html` après le chargement du document. + +### Que se passe‑t‑il si le fichier source est corrompu ou mal formé ? + +`HTMLDocument` tentera de récupérer les erreurs mineures, mais les malformations graves lèvent une exception. Enveloppez l’étape de chargement dans un bloc `try/except` pour gérer ces cas de façon élégante : + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Puis‑je modifier le DOM avant l’enregistrement ? + +Absolument. Après le chargement, vous avez un accès complet à l’arbre DOM (`html_doc.dom`). Vous pouvez insérer des nœuds, supprimer des éléments ou modifier des attributs, puis appeler `save` avec le streaming toujours activé. L’utilisation de la mémoire restera faible car les changements sont appliqués de façon incrémentale. + +### Le streaming affecte‑t‑il la qualité du résultat ? + +Non. La sortie en streaming est identique octet pour octet à ce que vous obtiendriez avec un enregistrement non‑streaming, tant que vous n’avez pas modifié le DOM. Le streaming ne change que la façon dont les données sont écrites, pas ce qui est écrit. + +## Astuce de performance : mesurer l’utilisation mémoire + +Si vous voulez vérifier que le streaming réduit réellement la consommation de mémoire, vous pouvez utiliser la bibliothèque `psutil` : + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Vous verrez généralement seulement quelques mégaoctets de RAM utilisés, même pour des fichiers HTML de 500 Mo. + +## Conclusion + +Dans ce tutoriel, vous avez appris à **load html document** efficacement en Python en : + +1. Instanciant `HTMLDocument` pour analyser le fichier de façon paresseuse. +2. Configurant `HtmlSaveOptions` avec `enable_streaming = True` pour des écritures à faible consommation mémoire. +3. Enregistrant le document tout en diffusant la sortie vers le disque. + +Ces trois étapes vous offrent un modèle robuste pour traiter des **large HTML files** à l’aide des techniques de **Python HTML processing**. À partir de là, vous pouvez étendre le script pour modifier le DOM, extraire des données ou traiter par lots des dizaines de fichiers — tout en maintenant une utilisation mémoire prévisible. + +**Prochaines étapes** + +* Explorez l’API DOM de `aspose.html` pour extraire des tableaux, des liens ou des images. +* Combinez cette approche avec le multithreading pour traiter plusieurs fichiers en parallèle. +* Consultez `HtmlLoadOptions` si vous devez contrôler l’encodage des caractères ou d’autres subtilités d’analyse. + +Bon codage, et profitez de cette méthode économique en mémoire pour **load html document** à grande échelle ! + +## Que devriez‑vous apprendre ensuite ? + + +Les tutoriels suivants couvrent des sujets étroitement liés qui s’appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code complets avec des explications pas à pas pour vous aider à maîtriser d’autres fonctionnalités de l’API et explorer des approches d’implémentation alternatives dans vos propres projets. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/german/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..d521751f37 --- /dev/null +++ b/html/german/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: HTML in Markdown in Python konvertieren mit einem vollständigen Beispiel. + Erfahren Sie, wie Sie HTML als Markdown speichern, Formatter auswählen und bestimmte + Funktionen aktivieren. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: de +lastmod: 2026-10-02 +og_description: HTML in Markdown mit Python konvertieren – mit praktischem Code, Formatierungsoptionen + und Feature‑Flags. Folgen Sie dieser Anleitung, um HTML schnell als Markdown zu + speichern. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: HTML in Markdown mit Python konvertieren – vollständiges Tutorial +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Wie man HTML in Markdown mit Python konvertiert – Schritt‑für‑Schritt‑Anleitung +url: /de/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man HTML in Markdown in Python konvertiert – Schritt‑für‑Schritt‑Anleitung + +Wenn Sie **HTML in Markdown konvertieren** müssen, zeigt Ihnen dieser Leitfaden eine vollständige, ausführbare Lösung in Python. Sie sehen, wie Sie **HTML als Markdown speichern**, den richtigen Formatter auswählen und nur die Funktionen aktivieren, die Sie benötigen. + +HTML in Markdown zu konvertieren ist eine gängige Aufgabe, wenn Sie leichte Dokumentation, Inhalte für statische Websites oder versionskontrollierte Textdateien benötigen. Dieses Tutorial behandelt alles von der Installation der Bibliothek bis zur Behandlung von Randfällen, sodass Sie die Technik auf jede HTML‑Quelle anwenden können. + +## Voraussetzungen + +* Python 3.8 oder neuer installiert. +* `pip`‑Zugriff zum Installieren von Drittanbieter‑Paketen. +* Grundlegende Kenntnisse von HTML‑Tags und Markdown‑Syntax. + +Keine zusätzlichen Systemabhängigkeiten sind erforderlich, da die Konvertierungsbibliothek reines Python ist. + +## Installieren der GroupDocs Conversion Bibliothek + +Das Code‑Beispiel verwendet das **GroupDocs.Conversion** Python‑Paket, das `HTMLDocument`, `MarkdownSaveOptions` und `Converter` bereitstellt. Installieren Sie es mit: + +```bash +pip install groupdocs-conversion +``` + +> **Pro‑Tipp:** Verwenden Sie eine virtuelle Umgebung (`python -m venv venv`), um das Paket von anderen Projekten zu isolieren. + +## Schritt 1: Erstellen eines `HTMLDocument` aus einem String + +Der erste Schritt besteht darin, Ihr rohes HTML in einer `HTMLDocument`‑Instanz zu verpacken. Dieses Objekt abstrahiert die Quelle, egal ob sie aus einem String, einer Datei oder einer entfernten URL stammt. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Warum das wichtig ist:* `HTMLDocument` analysiert das Markup einmal, sodass der Konverter mit einer normalisierten Darstellung anstatt rohem Text arbeiten kann. + +## Schritt 2: Konfigurieren von `MarkdownSaveOptions` + +`MarkdownSaveOptions` ermöglicht es Ihnen, das Ausgabeformat und welche Markdown‑Funktionen erzeugt werden, zu steuern. Die Bibliothek unterstützt zwei Formatter: + +* **DEFAULT** – standard CommonMark‑kompatibles Markdown. +* **GIT** – Git‑flavored Markdown (fügt Tabellen, Durchstreichungen usw. hinzu). + +Für die meisten Versionskontroll‑Szenarien wird der **GIT**‑Formatter bevorzugt. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Nur die benötigten Funktionen aktivieren + +Sie können die Ausgabe feinabstimmen, indem Sie bestimmte Feature‑Flags aktivieren. In diesem Beispiel behalten wir **links** und **paragraphs** bei, während wir Bilder, Tabellen und andere Konstrukte deaktivieren. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Warum das wichtig ist:* Das Begrenzen von Funktionen reduziert die Größe der erzeugten Datei und verhindert unerwartete Markdown‑Elemente, die nachgelagerte Werkzeuge möglicherweise nicht unterstützen. + +## Schritt 3: Dokument konvertieren + +Mit dem Quell‑`HTMLDocument` und den konfigurierten `MarkdownSaveOptions` erfolgt die Konvertierung mit einem einzigen Aufruf von `Converter.convert`. Geben Sie einen absoluten oder relativen Pfad für die Ausgabedatei an. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Nach Abschluss des Aufrufs enthält `output.md` die Markdown‑Darstellung des ursprünglichen HTML. + +## Vollständiges Skript, das Sie heute ausführen können + +Unten finden Sie das vollständige, eigenständige Skript, das alle vorherigen Schritte integriert. Speichern Sie es als `html_to_md.py` und führen Sie `python html_to_md.py` aus. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Erwartete Ausgabe (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Die Ausgabe entspricht der ursprünglichen HTML‑Struktur, während nur die aktivierten Funktionen (links, paragraphs und lists) angezeigt werden. + +## Umgang mit häufigen Randfällen + +### Fehlende oder fehlerhafte `href`‑Attribute + +Wenn ein ``‑Tag kein gültiges `href` hat, fügt der Konverter den Link‑Text ohne URL ein. Um die Lesbarkeit zu erhalten, möchten Sie das Markdown eventuell nachbearbeiten: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Konvertieren großer HTML‑Dateien + +Bei mehrmegabytegroßen HTML‑Dateien sollten Sie die Eingabe streamen, um zu vermeiden, dass das gesamte Markup in den Speicher geladen wird: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Der Konvertierungsprozess selbst bleibt unverändert, da `HTMLDocument` die Quellgröße abstrahiert. + +## Alternative Formatter + +Wenn Sie reines CommonMark statt Git‑flavored Ausgabe bevorzugen, wechseln Sie den Formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Dies ergibt eine minimalere Markdown‑Datei, die nützlich ist, wenn Sie Plattformen anvisieren, die Git‑Erweiterungen nicht unterstützen. + +## Verwandte Aufgaben, die Sie als Nächstes erkunden können + +* **Convert Markdown back to HTML** – nützlich zum Vorschaun von Dokumentation. +* **Export HTML to PDF** – ein weiterer gängiger Workflow, der an die **html to markdown conversion** anknüpft. +* **Batch process a folder of HTML files** – über Dateien iterieren und dieselbe `MarkdownSaveOptions`‑Instanz wiederverwenden. + +All dies folgt dem gleichen Muster: ein Quell‑Dokument erstellen, Save‑Optionen konfigurieren und `Converter.convert` aufrufen. + +## Fazit + +Sie wissen jetzt, wie man **HTML in Markdown** in Python **konvertiert**, wie man **HTML als Markdown speichert** mit präziser Funktionskontrolle, und warum die Auswahl des richtigen Formatters für nachgelagerte Werkzeuge wichtig ist. Das Beispiel zeigt einen sauberen, wiederverwendbaren Ansatz, der für einzelne Strings, Dateien oder URLs funktioniert und Tipps zum Umgang mit fehlenden Links und großen Eingaben enthält. + +Probieren Sie gerne zusätzliche `MarkdownSaveOptions.Features` (z. B. `IMAGE`, `TABLE`) aus, um die Ausgabe an die Bedürfnisse Ihres Projekts anzupassen. Wenn Ihnen dieser Leitfaden geholfen hat, teilen Sie ihn mit Kollegen oder verlinken Sie ihn in Ihrer Projektdokumentation. Viel Spaß beim Konvertieren! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/german/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..2d0a5635d5 --- /dev/null +++ b/html/german/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Lernen Sie, wie man ein SVG-Dokument in Python erstellt, das SVG in einer + Datei speichert und das SVG-Bild mit einem kurzen, vollständigen Skript exportiert. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: de +lastmod: 2026-10-02 +og_description: Erstelle ein SVG-Dokument in Python und exportiere das SVG-Bild mit + diesem praktischen Tutorial. Folge dem Skript, speichere das SVG in einer Datei + und verwende die Vektorgrafik sofort wieder. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: SVG-Dokument in Python erstellen – Schritt‑für‑Schritt‑Anleitung +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Wie man ein SVG‑Dokument erstellt und es in Python als Bild exportiert +url: /de/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man ein SVG-Dokument erstellt und es als Bild in Python exportiert + +Wenn Sie **SVG-Dokument erstellen** programmgesteuert benötigen, zeigt Ihnen dieses Tutorial genau, wie Sie das mit Python machen. Sie sehen ein vollständiges Skript, das einen einfachen Kreis erzeugt, das SVG in eine Datei speichert und ein exportierbares SVG‑Bild erzeugt, das Sie überall einbetten können. + +Das Erzeugen skalierbarer Vektorgrafiken aus Code eliminiert den manuellen Aufwand, Formen in einem GUI‑Editor zu zeichnen. Am Ende dieses Leitfadens können Sie die SVG‑Erstellung in Daten‑Visualisierungs‑Pipelines, automatisierte Berichtsgeneratoren oder jedes Projekt integrieren, das gestochen scharfe, auflösungsunabhängige Grafiken erfordert. + +## Voraussetzungen + +Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben: + +- Python 3.8 oder neuer installiert +- Die Bibliothek `svgwrite` (Installation mit `pip install svgwrite`) +- Schreibrechte für das Verzeichnis, in dem das SVG gespeichert wird + +Diese Voraussetzungen halten das Beispiel leichtgewichtig und mit den meisten Umgebungen kompatibel. + +## Schritt 1: Installieren und importieren der SVG‑Bibliothek + +Der erste Schritt besteht darin, die Drittanbieter‑Bibliothek hinzuzufügen, die eine bequeme API für die SVG‑Erstellung bereitstellt. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrahiert die XML‑Struktur einer SVG‑Datei, sodass Sie sich auf Geometrie statt auf rohes Markup konzentrieren können. + +## Schritt 2: Ein SVG‑Dokumentobjekt erstellen + +Jetzt können Sie **SVG-Dokument erstellen** indem Sie `svgwrite.Drawing` instanziieren. Dieses Objekt repräsentiert das Wurzelelement `` und enthält alle nachfolgenden Formen. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Das Argument `size` definiert die gerenderten Pixelabmessungen, während `viewBox` ein Koordinatensystem festlegt, das zur später definierten Geometrie passt. + +## Schritt 3: Ein Kreiselement hinzufügen + +Ein Kreis wird durch sein Zentrum (`cx`, `cy`) und seinen Radius (`r`) definiert. Verwenden Sie den Helfer `circle`, um diese Attribute anzuhängen. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Der Kreis befindet sich in der Mitte der 100 × 100‑Leinwand und lässt an jeder Seite einen Rand von 10 Pixeln. Passen Sie `fill` und `stroke` an, um Ihrer Designsprache zu entsprechen. + +## Schritt 4: Das SVG in eine Datei speichern + +Nachdem die Grafik zusammengesetzt ist, können Sie **SVG in Datei speichern** mit der Methode `save`. Dies schreibt wohlgeformtes XML, das Browser und Vektor‑Editoren verstehen. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Die Datei `circle.svg` befindet sich nun im aktuellen Arbeitsverzeichnis. Sie können sie in einem Web‑Browser, Inkscape oder einem anderen Tool, das das SVG‑Format unterstützt, öffnen. + +## Schritt 5: Das exportierte SVG‑Bild überprüfen + +Öffnen Sie die gespeicherte Datei in einem Browser, um das Ergebnis zu bestätigen. Sie sollten einen zentrierten Kreis mit den angegebenen Farben sehen. Das rohe XML sieht folgendermaßen aus: + +```xml + + + + +``` + +Da SVG vektor‑basiert ist, können Sie das Bild ohne Qualitätsverlust skalieren, was es ideal für responsive Web‑Designs oder hochauflösenden Druck macht. + +## Profi‑Tipp: SVG als PNG oder JPEG exportieren + +Falls Sie eine Raster‑Version benötigen, kombinieren Sie die SVG‑Datei mit einem Konvertierungstool wie **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Dieser Schritt demonstriert **SVG‑Bild exportieren** in ein Bitmap‑Format, nützlich, wenn nachgelagerte Systeme SVG nicht direkt rendern können. + +## Häufige Variationen und Sonderfälle + +| Variation | Wie man damit umgeht | +|-----------|----------------------| +| Mehrere Formen | Rufen Sie `dwg.add()` für jedes neue Element (rect, line, path) auf. | +| Dynamische Abmessungen | Berechnen Sie `size` und `viewBox` aus den Daten, bevor Sie `Drawing` erstellen. | +| Textbeschriftungen | Verwenden Sie `dwg.text("Label", insert=("10", "20"))` und stylen Sie mit `font_size` und `fill`. | +| Wiederverwendung des Dokuments | Halten Sie das `Drawing`‑Objekt im Speicher und rufen Sie `save()` auf, wann immer Sie eine aktualisierte Datei benötigen. | +| Große Dateien | Streamen Sie die Ausgabe mit `dwg.tostring()` und schreiben Sie manuell in ein Datei‑Objekt, um Speicher‑Spikes zu vermeiden. | + +Die Behandlung dieser Szenarien stellt sicher, dass Ihr **wie man SVG generiert**‑Skript von einfachen Icons bis zu komplexen Diagrammen skaliert. + +## Vollständige Skript‑Zusammenfassung + +Unten finden Sie das komplette, ausführbare Beispiel, das alle Schritte und die optionale Konvertierung integriert: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Wenn Sie dieses Skript ausführen, entsteht `circle.svg` und, falls `cairosvg` installiert ist, `circle.png`. Beide Dateien sind bereit für die Einbindung in Webseiten, Berichte oder weitere Verarbeitung. + +## Fazit + +Sie wissen jetzt, wie man **SVG-Dokument erstellen** in Python, **SVG in Datei speichern** und **SVG‑Bild exportieren** für breitere Nutzung. Das Beispiel deckt die wesentlichen API‑Aufrufe ab, erklärt, warum jeder Schritt wichtig ist, und bietet Erweiterungen für komplexere Grafiken. + +Als Nächstes können Sie weitere **SVG‑Python‑Tutorial**‑Themen erkunden, etwa das Zeichnen von Pfaden, das Anwenden von Farbverläufen und das Animieren von Elementen. Die Integration dieser Techniken ermöglicht es Ihnen, dynamische, datengetriebene Vektorgrafiken direkt aus Ihren Python‑Anwendungen zu erzeugen. Viel Spaß beim Coden! + +## Was sollten Sie als Nächstes lernen? + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, zusätzliche API‑Funktionen zu meistern und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [SVG-Dokumente in Aspose.HTML für Java erstellen und verwalten](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [SVG-Dokument in Aspose.HTML für Java speichern](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – SVG mit Aspose.HTML für Java in Bild konvertieren](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/german/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..e705395a64 --- /dev/null +++ b/html/german/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Erfahren Sie, wie Sie ein HTML-Dokument in Python mit HtmlSaveOptions + und Streaming laden, um große HTML-Dateien effizient zu verarbeiten. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: de +lastmod: 2026-10-02 +og_description: Laden Sie ein HTML‑Dokument in Python mit HtmlSaveOptions und Streaming. + Dieses Tutorial zeigt eine vollständige, sofort einsatzbereite Lösung für große + HTML‑Dateien. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: HTML-Dokument mit Streaming in Python laden – Schritt‑für‑Schritt-Anleitung +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Wie man ein HTML-Dokument in Python mit Streaming lädt +url: /de/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man ein HTML-Dokument mit Streaming in Python lädt + +Wenn Sie **load html document**-Dateien haben, die mehrere hundert Megabyte oder größer sind, stoßen Sie schnell auf Speicherverbrauchs‑Probleme. Dieser Leitfaden zeigt Ihnen eine komplette, sofort einsatzbereite Lösung, die **HTML streaming** verwendet, um den Speicherverbrauch gering zu halten und Ihnen gleichzeitig vollen Zugriff auf den Inhalt des Dokuments zu geben. + +Sie lernen, wie Sie `HtmlSaveOptions` konfigurieren, Streaming aktivieren und die verarbeitete Datei speichern – alles in nur drei knappen Schritten. Keine externen Werkzeuge sind erforderlich, außer dem Standard‑`aspose.html`‑Python‑Paket, was den Ansatz ideal für Batch‑Jobs, serverseitige Pipelines oder lokale Skripte macht, die **large HTML files** verarbeiten. + +## Voraussetzungen + +* Python 3.8 oder neuer installiert. +* Die `aspose.html`‑Bibliothek (`pip install aspose-html`) – sie stellt `HTMLDocument` und `HtmlSaveOptions` bereit. +* Ein Verzeichnis, das die große HTML‑Datei enthält, mit der Sie arbeiten möchten (z. B. `large.html`). + +Diese Anforderungen sind minimal, sodass Sie sich auf die Kernlogik des effizienten Ladens eines HTML‑Dokuments konzentrieren können. + +## Schritt 1: Laden des HTML‑Dokuments + +Die erste Operation besteht darin, eine `HTMLDocument`‑Instanz zu erstellen, die auf die Quelldatei zeigt. Dieses Objekt repräsentiert die **load html document**‑Operation und parst das Markup lazy, was für die Verarbeitung großer Dateien unerlässlich ist. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Warum das wichtig ist:** +Das Erstellen des `HTMLDocument`‑Objekts liest nicht sofort die gesamte Datei in den Speicher. Stattdessen wird ein Streaming‑Parser vorbereitet, der bei Bedarf Daten von der Festplatte zieht. Dieses Design ermöglicht die Arbeit mit Dateien, die den RAM Ihres Rechners überschreiten. + +## Schritt 2: Streaming mit HtmlSaveOptions aktivieren + +Um den Speicherverbrauch gering zu halten, während Sie das Dokument manipulieren oder speichern, müssen Sie den Streaming‑Modus bei `HtmlSaveOptions` aktivieren. Dieses sekundäre Schlüsselwort, **HtmlSaveOptions**, steuert, wie die Bibliothek die Ausgabedatei schreibt. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Warum Streaming aktivieren?** +Wenn `enable_streaming` auf `True` gesetzt ist, schreibt die Bibliothek die Ausgabe in Teilen, anstatt das gesamte Ergebnis im Speicher zu puffern. Das ist entscheidend, wenn Sie später **save the document** ausführen oder Transformationen an **large HTML files** vornehmen. + +## Schritt 3: Dokument mit den konfigurierten Optionen speichern + +Jetzt, wo Streaming aktiv ist, können Sie den verarbeiteten Inhalt sicher in eine neue Datei schreiben. Die `save`‑Methode berücksichtigt die konfigurierten `HtmlSaveOptions` und stellt sicher, dass die Operation speichereffizient bleibt. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Was im Hintergrund passiert:** +Der Aufruf von `save` streamt das HTML‑Markup Stück für Stück nach `large_out.html`. Da das Dokument mit dem Streaming‑Parser geladen wurde, arbeitet die gesamte Pipeline – vom Laden bis zum Speichern – mit einem konstant niedrigen Speicherverbrauch. + +## Vollständiges funktionierendes Beispiel + +Wenn Sie die drei Schritte zusammenführen, erhalten Sie ein kompaktes Skript, das Sie direkt von der Befehlszeile ausführen können: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Erwartete Ausgabe** + +Wenn Sie das Skript ausführen (`python load_html_document_streaming.py`), sollten Sie folgendes sehen: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Die Datei `large_out.html` wird eine getreue Kopie des Originals sein, jedoch wurde sie verarbeitet, ohne die gesamte Datei jemals in den RAM zu laden. + +## Häufige Fragen und Edge‑Case‑Behandlung + +### Funktioniert das mit HTML‑Dateien, die externe Ressourcen (Bilder, CSS, Skripte) enthalten? + +Ja. Der Streaming‑Parser behandelt externe Verweise wie gewöhnliche Attribute. Er **lädt** die Ressourcen nicht herunter, es sei denn, Sie fordern sie ausdrücklich an. Wenn Sie diese Ressourcen einbetten müssen, können Sie nach dem Laden des Dokuments zusätzliche APIs von `aspose.html` verwenden. + +### Was ist, wenn die Quelldatei beschädigt oder nicht wohlgeformtes HTML ist? + +`HTMLDocument` versucht, kleinere Fehler zu korrigieren, aber schwere Fehlbildungen werfen eine Ausnahme. Wickeln Sie den Ladeschritt in einen `try/except`‑Block, um solche Fälle elegant zu behandeln: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Kann ich das DOM vor dem Speichern ändern? + +Absolut. Nach dem Laden haben Sie vollen Zugriff auf den DOM‑Baum (`html_doc.dom`). Sie können Knoten einfügen, Elemente entfernen oder Attribute ändern und anschließend `save` aufrufen, wobei Streaming weiterhin aktiviert ist. Der Speicherverbrauch bleibt niedrig, da Änderungen schrittweise angewendet werden. + +### Beeinflusst Streaming die Ausgabequalität? + +Nein. Die gestreamte Ausgabe ist Byte‑für‑Byte identisch mit dem, was Sie bei einem nicht‑gestreamten Speichern erhalten würden, vorausgesetzt, Sie haben keine DOM‑Modifikationen vorgenommen. Streaming ändert lediglich, wie die Daten geschrieben werden, nicht was geschrieben wird. + +## Performance‑Tipp: Speicherverbrauch messen + +Wenn Sie überprüfen möchten, dass Streaming den Speicherverbrauch tatsächlich reduziert, können Sie die `psutil`‑Bibliothek verwenden: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Sie werden typischerweise nur wenige Megabyte RAM sehen, selbst bei 500 MB HTML‑Dateien. + +## Fazit + +In diesem Tutorial haben Sie gelernt, wie man **load html document** effizient in Python durchführt, indem man: + +1. Instanziieren von `HTMLDocument`, um die Datei lazy zu parsen. +2. Konfigurieren von `HtmlSaveOptions` mit `enable_streaming = True` für speicherschonende Schreibvorgänge. +3. Speichern des Dokuments, während die Ausgabe gestreamt auf die Festplatte geschrieben wird. + +Diese drei Schritte bieten Ihnen ein robustes Muster zur Verarbeitung von **large HTML files** mit **Python HTML processing**‑Techniken. Von hier aus können Sie das Skript erweitern, um das DOM zu modifizieren, Daten zu extrahieren oder Dutzende von Dateien stapelweise zu verarbeiten – stets mit vorhersehbarem Speicherverbrauch. + +**Nächste Schritte** + +* Erkunden Sie die `aspose.html`‑DOM‑API, um Tabellen, Links oder Bilder zu extrahieren. +* Kombinieren Sie diesen Ansatz mit Multithreading, um mehrere Dateien parallel zu verarbeiten. +* Schauen Sie sich `HtmlLoadOptions` an, falls Sie die Zeichenkodierung oder andere Parsing‑Nuancen steuern müssen. + +Viel Spaß beim Coden und genießen Sie die speicherschonende Methode, **load html document** in großem Maßstab zu verarbeiten! + +## Was sollten Sie als Nächstes lernen? + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Codebeispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, weitere API‑Funktionen zu beherrschen und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [HTML-Dokument in Java laden – Vollständiger Leitfaden mit XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [HTML über URL in .NET mit Aspose.HTML laden](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Wie man JavaScript in Aspose HTML aktiviert – HTML laden & Text erhalten](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/greek/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..d3ef0c2090 --- /dev/null +++ b/html/greek/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Μετατρέψτε HTML σε Markdown σε Python με ένα πλήρες παράδειγμα. Μάθετε + πώς να αποθηκεύετε HTML ως Markdown, να επιλέγετε μορφοποιητές και να ενεργοποιείτε + συγκεκριμένες λειτουργίες. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: el +lastmod: 2026-10-02 +og_description: Μετατρέψτε HTML σε Markdown σε Python με πρακτικό κώδικα, επιλογές + μορφοποίησης και σημαίες χαρακτηριστικών. Ακολουθήστε αυτόν τον οδηγό για να αποθηκεύσετε + γρήγορα το HTML ως Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Μετατροπή HTML σε Markdown με Python – πλήρες σεμινάριο +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Πώς να μετατρέψετε HTML σε Markdown με Python – βήμα‑βήμα οδηγός +url: /el/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να μετατρέψετε HTML σε Markdown σε Python – βήμα‑βήμα οδηγός + +Αν χρειάζεστε **μετατροπή HTML σε Markdown**, αυτός ο οδηγός σας παρουσιάζει μια πλήρη, εκτελέσιμη λύση σε Python. Θα δείτε πώς να **αποθηκεύσετε HTML ως Markdown**, να επιλέξετε τον κατάλληλο μορφοποιητή και να ενεργοποιήσετε μόνο τις δυνατότητες που σας ενδιαφέρουν. + +Η μετατροπή HTML σε Markdown είναι μια συνηθισμένη εργασία όταν θέλετε ελαφριά τεκμηρίωση, περιεχόμενο στατικού ιστότοπου ή αρχεία κειμένου ελεγχόμενα με έκδοση. Αυτό το tutorial καλύπτει τα πάντα, από την εγκατάσταση της βιβλιοθήκης μέχρι τη διαχείριση ειδικών περιπτώσεων, ώστε να μπορείτε να εφαρμόσετε την τεχνική σε οποιαδήποτε πηγή HTML. + +## Προαπαιτούμενα + +* Python 3.8 ή νεότερη εγκατεστημένη. +* `pip` πρόσβαση για εγκατάσταση τρίτων πακέτων. +* Βασική εξοικείωση με ετικέτες HTML και σύνταξη Markdown. + +Δεν απαιτούνται πρόσθετες εξαρτήσεις συστήματος επειδή η βιβλιοθήκη μετατροπής είναι καθαρά Python. + +## Εγκατάσταση της βιβλιοθήκης GroupDocs Conversion + +Το παράδειγμα κώδικα χρησιμοποιεί το πακέτο Python **GroupDocs.Conversion**, το οποίο παρέχει `HTMLDocument`, `MarkdownSaveOptions` και `Converter`. Εγκαταστήστε το με: + +```bash +pip install groupdocs-conversion +``` + +> **Συμβουλή:** Χρησιμοποιήστε ένα εικονικό περιβάλλον (`python -m venv venv`) για να διατηρήσετε το πακέτο απομονωμένο από άλλα έργα. + +## Βήμα 1: Δημιουργία ενός `HTMLDocument` από μια συμβολοσειρά + +Το πρώτο βήμα είναι να τυλίξετε το ακατέργαστο HTML σας σε μια παρουσία `HTMLDocument`. Αυτό το αντικείμενο αφαιρεί την άμεση εξάρτηση από την πηγή, είτε προέρχεται από συμβολοσειρά, αρχείο ή απομακρυσμένο URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Γιατί είναι σημαντικό:* `HTMLDocument` αναλύει το markup μία φορά, επιτρέποντας στον μετατροπέα να εργάζεται με μια κανονικοποιημένη αναπαράσταση αντί για ακατέργαστο κείμενο. + +## Βήμα 2: Διαμόρφωση του `MarkdownSaveOptions` + +`MarkdownSaveOptions` σας επιτρέπει να ελέγχετε τη μορφή εξόδου και ποιες δυνατότητες του Markdown θα παραχθούν. Η βιβλιοθήκη υποστηρίζει δύο μορφοποιητές: + +* **DEFAULT** – τυπικό Markdown συμβατό με CommonMark. +* **GIT** – Markdown με γεύση Git (προσθέτει πίνακες, διακριτή γραμμή κ.λπ.). + +Για τις περισσότερες περιπτώσεις ελέγχου εκδόσεων, προτιμάται ο μορφοποιητής **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Ενεργοποίηση μόνο των απαιτούμενων λειτουργιών + +Μπορείτε να ρυθμίσετε λεπτομερώς την έξοδο ενεργοποιώντας συγκεκριμένες σημαίες λειτουργιών. Σε αυτό το παράδειγμα διατηρούμε **συνδέσμους** και **παραγράφους**, ενώ απενεργοποιούμε εικόνες, πίνακες και άλλες δομές. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Γιατί είναι σημαντικό:* Ο περιορισμός των λειτουργιών μειώνει το μέγεθος του παραγόμενου αρχείου και αποτρέπει απρόσμενα στοιχεία Markdown που ενδέχεται να μην υποστηρίζονται από τα επόμενα εργαλεία. + +## Βήμα 3: Μετατροπή του εγγράφου + +Με το `HTMLDocument` πηγή και τις ρυθμισμένες `MarkdownSaveOptions`, η μετατροπή είναι μια ενιαία κλήση στο `Converter.convert`. Παρέχετε μια απόλυτη ή σχετική διαδρομή για το αρχείο εξόδου. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Μετά το τέλος της κλήσης, το `output.md` περιέχει την αναπαράσταση Markdown του αρχικού HTML. + +## Πλήρες σενάριο που μπορείτε να εκτελέσετε σήμερα + +Παρακάτω βρίσκεται το πλήρες, αυτόνομο σενάριο που ενσωματώνει όλα τα προηγούμενα βήματα. Αποθηκεύστε το ως `html_to_md.py` και εκτελέστε `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Αναμενόμενη έξοδος (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Η έξοδος ταιριάζει με την αρχική δομή HTML ενώ εκθέτει μόνο τις λειτουργίες που ενεργοποιήσαμε (σύνδεσμοι, παράγραφοι και λίστες). + +## Διαχείριση κοινών ειδικών περιπτώσεων + +### Ελλιπείς ή κακοδιατυπωμένα χαρακτηριστικά `href` + +Αν μια ετικέτα `` δεν έχει έγκυρο `href`, ο μετατροπέας εισάγει το κείμενο του συνδέσμου χωρίς URL. Για να διατηρήσετε την αναγνωσιμότητα, ίσως θελήσετε να επεξεργαστείτε μετά το Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Μετατροπή μεγάλων αρχείων HTML + +Για αρχεία HTML πολλαπλών megabyte, ροή (stream) της εισόδου για να αποφύγετε τη φόρτωση ολόκληρου του markup στη μνήμη: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Η διαδικασία μετατροπής παραμένει αμετάβλητη επειδή το `HTMLDocument` αφαιρεί το μέγεθος της πηγής. + +## Εναλλακτικοί μορφοποιητές + +Αν προτιμάτε απλό CommonMark αντί για έξοδο με γεύση Git, αλλάξτε τον μορφοποιητή: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Αυτό παράγει ένα πιο ελαφρύ αρχείο Markdown, χρήσιμο όταν στοχεύετε πλατφόρμες που δεν υποστηρίζουν επεκτάσεις Git. + +## Σχετικές εργασίες που μπορείτε να εξερευνήσετε στη συνέχεια + +* **Convert Markdown back to HTML** – χρήσιμο για προεπισκόπηση τεκμηρίωσης. +* **Export HTML to PDF** – άλλη μια κοινή ροή εργασίας σχετική με **html to markdown conversion**. +* **Batch process a folder of HTML files** – επανάληψη πάνω σε αρχεία και επαναχρησιμοποίηση της ίδιας παρουσίας `MarkdownSaveOptions`. + +Όλα αυτά ακολουθούν το ίδιο μοτίβο: δημιουργήστε ένα έγγραφο πηγής, διαμορφώστε τις επιλογές αποθήκευσης και καλέστε `Converter.convert`. + +## Συμπέρασμα + +Τώρα γνωρίζετε πώς να **μετατρέψετε HTML σε Markdown** σε Python, πώς να **αποθηκεύσετε HTML ως Markdown** με ακριβή έλεγχο λειτουργιών, και γιατί η επιλογή του σωστού μορφοποιητή είναι σημαντική για τα επόμενα εργαλεία. Το παράδειγμα δείχνει μια καθαρή, επαναχρησιμοποιήσιμη προσέγγιση που λειτουργεί για μεμονωμένες συμβολοσειρές, αρχεία ή URLs, και περιλαμβάνει συμβουλές για τη διαχείριση ελλιπών συνδέσμων και μεγάλων εισόδων. + +Μη διστάσετε να πειραματιστείτε με πρόσθετες `MarkdownSaveOptions.Features` (π.χ., `IMAGE`, `TABLE`) για να προσαρμόσετε την έξοδο στις ανάγκες του έργου σας. Αν βρήκατε αυτόν τον οδηγό χρήσιμο, μοιραστείτε τον με συναδέλφους ή συνδέστε τον από την τεκμηρίωση του έργου σας. Καλή μετατροπή! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/greek/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..26a4311594 --- /dev/null +++ b/html/greek/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Μάθετε πώς να δημιουργήσετε ένα έγγραφο SVG με την Python, να αποθηκεύσετε + το SVG σε αρχείο και να εξάγετε την εικόνα SVG με ένα σύντομο, πλήρες σενάριο. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: el +lastmod: 2026-10-02 +og_description: Δημιουργήστε έγγραφο SVG στην Python και εξάγετε εικόνα SVG με αυτό + το πρακτικό σεμινάριο. Ακολουθήστε το σενάριο, αποθηκεύστε το SVG σε αρχείο και + επαναχρησιμοποιήστε το διανυσματικό γραφικό άμεσα. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Δημιουργία εγγράφου SVG σε Python – βήμα‑βήμα οδηγός +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Πώς να δημιουργήσετε έγγραφο SVG και να το εξάγετε ως εικόνα σε Python +url: /el/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να δημιουργήσετε έγγραφο SVG και να το εξάγετε ως εικόνα σε Python + +Αν χρειάζεστε **να δημιουργήσετε έγγραφο SVG** προγραμματιστικά, αυτό το σεμινάριο σας δείχνει ακριβώς πώς να το κάνετε με Python. Θα δείτε ένα πλήρες σενάριο που δημιουργεί έναν απλό κύκλο, αποθηκεύει το SVG σε αρχείο και παράγει μια εξαγώγιμη εικόνα SVG που μπορείτε να ενσωματώσετε οπουδήποτε. + +Η δημιουργία διανυσματικών γραφικών από κώδικα αφαιρεί την ανάγκη χειροκίνητης σχεδίασης σχημάτων σε επεξεργαστή GUI. Στο τέλος αυτού του οδηγού θα μπορείτε να ενσωματώσετε τη δημιουργία SVG σε pipelines οπτικοποίησης δεδομένων, αυτοματοποιημένους δημιουργούς αναφορών ή οποιοδήποτε έργο που απαιτεί καθαρά, ανεξάρτητα από την ανάλυση γραφικά. + +## Προαπαιτούμενα + +Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε: + +- Python 3.8 ή νεότερη έκδοση εγκατεστημένη +- Τη βιβλιοθήκη `svgwrite` (εγκατάσταση με `pip install svgwrite`) +- Δικαιώματα εγγραφής στον φάκελο όπου θα αποθηκευτεί το SVG + +Αυτές οι απαιτήσεις κρατούν το παράδειγμα ελαφρύ και συμβατό με τις περισσότερες περιβάλλοντα. + +## Βήμα 1: Εγκατάσταση και εισαγωγή της βιβλιοθήκης SVG + +Το πρώτο βήμα είναι η προσθήκη της τρίτης‑πλευράς βιβλιοθήκης που παρέχει ένα βολικό API για τη δημιουργία SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +Η `svgwrite` αφαιρεί την πολυπλοκότητα της XML δομής ενός αρχείου SVG, επιτρέποντάς σας να εστιάσετε στη γεωμετρία αντί για το ακατέργαστο markup. + +## Βήμα 2: Δημιουργία αντικειμένου εγγράφου SVG + +Τώρα μπορείτε **να δημιουργήσετε έγγραφο SVG** δημιουργώντας ένα στιγμιότυπο του `svgwrite.Drawing`. Αυτό το αντικείμενο αντιπροσωπεύει το ριζικό στοιχείο `` και περιέχει όλα τα επόμενα σχήματα. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Το όρισμα `size` ορίζει τις διαστάσεις σε εικονοστοιχεία που θα αποδοθούν, ενώ το `viewBox` καθορίζει ένα σύστημα συντεταγμένων που ταιριάζει με τη γεωμετρία που θα ορίσετε αργότερα. + +## Βήμα 3: Προσθήκη στοιχείου κύκλου + +Ένας κύκλος ορίζεται από το κέντρο του (`cx`, `cy`) και την ακτίνα (`r`). Χρησιμοποιήστε τη βοηθητική μέθοδο `circle` για να προσθέσετε αυτά τα χαρακτηριστικά. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Ο κύκλος βρίσκεται στο κέντρο του καμβά 100 × 100, αφήνοντας ένα περιθώριο 10 pixel σε κάθε πλευρά. Προσαρμόστε το `fill` και το `stroke` ώστε να ταιριάζουν με τη γλώσσα σχεδίασής σας. + +## Βήμα 4: Αποθήκευση του SVG σε αρχείο + +Με το γραφικό έτοιμο, μπορείτε **να αποθηκεύσετε το SVG σε αρχείο** χρησιμοποιώντας τη μέθοδο `save`. Αυτό γράφει ένα σωστά δομημένο XML που καταλαβαίνουν οι browsers και οι επεξεργαστές διανυσματικών γραφικών. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Το αρχείο `circle.svg` βρίσκεται τώρα στον τρέχοντα φάκελο εργασίας. Μπορείτε να το ανοίξετε σε έναν web browser, το Inkscape ή οποιοδήποτε εργαλείο που υποστηρίζει τη μορφή SVG. + +## Βήμα 5: Επαλήθευση της εξαγόμενης εικόνας SVG + +Ανοίξτε το αποθηκευμένο αρχείο σε έναν browser για να επιβεβαιώσετε το αποτέλεσμα. Θα πρέπει να δείτε έναν κεντρικό κύκλο με τα καθορισμένα χρώματα. Το ακατέργαστο XML είναι ως εξής: + +```xml + + + + +``` + +Επειδή το SVG είναι διανυσματικό, μπορείτε να κλιμακώσετε την εικόνα χωρίς απώλεια ποιότητας, καθιστώντας το ιδανικό για ανταποκρινόμενα web designs ή εκτυπώσεις υψηλής ανάλυσης. + +## Συμβουλή επαγγελματία: Εξαγωγή SVG ως PNG ή JPEG + +Αν χρειάζεστε μια ραστερική έκδοση, συνδυάστε το αρχείο SVG με ένα εργαλείο μετατροπής όπως το **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Αυτό το βήμα δείχνει **την εξαγωγή εικόνας SVG** σε μορφή bitmap, χρήσιμο όταν τα επόμενα συστήματα δεν μπορούν να αποδώσουν SVG άμεσα. + +## Συνηθισμένες παραλλαγές και ειδικές περιπτώσεις + +| Παραλλαγή | Πώς να το διαχειριστείτε | +|-----------|--------------------------| +| Πολλαπλά σχήματα | Καλέστε `dwg.add()` για κάθε νέο στοιχείο (rect, line, path). | +| Δυναμικές διαστάσεις | Υπολογίστε `size` και `viewBox` από τα δεδομένα πριν δημιουργήσετε το `Drawing`. | +| Ετικέτες κειμένου | Χρησιμοποιήστε `dwg.text("Label", insert=("10", "20"))` και μορφοποιήστε με `font_size` και `fill`. | +| Επαναχρησιμοποίηση του εγγράφου | Κρατήστε το αντικείμενο `Drawing` στη μνήμη και καλέστε `save()` όποτε χρειάζεστε ενημερωμένο αρχείο. | +| Μεγάλα αρχεία | Ροή εξόδου χρησιμοποιώντας `dwg.tostring()` και γράψτε σε αντικείμενο αρχείου χειροκίνητα για αποφυγή αιχμών μνήμης. | + +Η αντιμετώπιση αυτών των σεναρίων εξασφαλίζει ότι το **σενάριο δημιουργίας SVG** σας κλιμακώνεται από απλά εικονίδια έως πολύπλοκα διαγράμματα. + +## Πλήρης επανάληψη κώδικα + +Παρακάτω βρίσκεται το πλήρες, εκτελέσιμο παράδειγμα που ενσωματώνει όλα τα βήματα και την προαιρετική μετατροπή: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Η εκτέλεση αυτού του σεναρίου παράγει το `circle.svg` και, αν είναι εγκατεστημένο το `cairosvg`, το `circle.png`. Και τα δύο αρχεία είναι έτοιμα για ενσωμάτωση σε ιστοσελίδες, αναφορές ή περαιτέρω επεξεργασία. + +## Συμπέρασμα + +Τώρα ξέρετε πώς να **δημιουργήσετε έγγραφο SVG** σε Python, **να αποθηκεύσετε SVG σε αρχείο**, και **να εξάγετε εικόνα SVG** για ευρύτερη χρήση. Το παράδειγμα καλύπτει τις βασικές κλήσεις API, εξηγεί γιατί κάθε βήμα είναι σημαντικό και προσφέρει επεκτάσεις για πιο σύνθετα γραφικά. + +Στη συνέχεια, εξερευνήστε επιπλέον θέματα του **SVG Python tutorial** όπως η σχεδίαση μονοπατιών, η εφαρμογή διαβαθμίσεων χρωμάτων και η κίνηση στοιχείων. Η ενσωμάτωση αυτών των τεχνικών θα σας επιτρέψει να δημιουργείτε δυναμικά, δεδομένα‑κινητά διανυσματικά γραφικά απευθείας από τις εφαρμογές σας σε Python. Καλό προγραμματισμό! + +## Τι πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω σεμινάρια καλύπτουν στενά σχετιζόμενα θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη λειτουργικό κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσει να κυριαρχήσετε πρόσθετες δυνατότητες του API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Δημιουργία και διαχείριση εγγράφων SVG στο Aspose.HTML για Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Αποθήκευση εγγράφου SVG στο Aspose.HTML για Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Μετατροπή SVG σε εικόνα με Aspose.HTML για Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/greek/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..02086416bd --- /dev/null +++ b/html/greek/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Μάθετε πώς να φορτώνετε έγγραφο HTML στην Python με HtmlSaveOptions και + streaming για να επεξεργάζεστε μεγάλα αρχεία HTML αποδοτικά. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: el +lastmod: 2026-10-02 +og_description: Φορτώστε έγγραφο HTML σε Python χρησιμοποιώντας HtmlSaveOptions και + ροή. Αυτό το σεμινάριο παρουσιάζει μια πλήρη, έτοιμη προς εκτέλεση λύση για μεγάλα + αρχεία HTML. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Φόρτωση εγγράφου HTML με ροή σε Python – οδηγός βήμα‑προς‑βήμα +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Πώς να φορτώσετε έγγραφο HTML με ροή στην Python +url: /el/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να φορτώσετε έγγραφο html με streaming σε Python + +Αν χρειάζεστε να **φορτώσετε έγγραφο html** αρχεία που είναι αρκετές εκατοντάδες megabytes ή μεγαλύτερα, θα αντιμετωπίσετε γρήγορα προβλήματα χρήσης μνήμης. Αυτός ο οδηγός σας παρουσιάζει μια πλήρη, έτοιμη προς εκτέλεση λύση που χρησιμοποιεί **HTML streaming** για να διατηρεί τη χρήση μνήμης χαμηλή, ενώ σας παρέχει πλήρη πρόσβαση στα περιεχόμενα του εγγράφου. + +Θα μάθετε πώς να ρυθμίσετε το `HtmlSaveOptions`, να ενεργοποιήσετε το streaming και να αποθηκεύσετε το επεξεργασμένο αρχείο — όλα σε μόλις τρία σύντομα βήματα. Δεν απαιτούνται εξωτερικά εργαλεία πέρα από το τυπικό πακέτο Python `aspose.html`, καθιστώντας την προσέγγιση ιδανική για εργασίες batch, pipelines στο server‑side ή τοπικά scripts που χειρίζονται **μεγάλα αρχεία HTML**. + +## Προαπαιτούμενα + +* Εγκατεστημένο Python 3.8 ή νεότερο. +* Η βιβλιοθήκη `aspose.html` (`pip install aspose-html`) – παρέχει `HTMLDocument` και `HtmlSaveOptions`. +* Ένας φάκελος που περιέχει το μεγάλο αρχείο HTML με το οποίο θέλετε να εργαστείτε (π.χ., `large.html`). + +Αυτές οι απαιτήσεις είναι ελάχιστες, ώστε να μπορείτε να εστιάσετε στη βασική λογική της αποδοτικής φόρτωσης ενός εγγράφου HTML. + +## Βήμα 1: Φορτώστε το έγγραφο HTML + +Η πρώτη ενέργεια είναι η δημιουργία μιας παρουσίας `HTMLDocument` που δείχνει στο αρχείο προέλευσης. Αυτό το αντικείμενο αντιπροσωπεύει τη λειτουργία **load html document** και αναλύει τη σήμανση αργά (lazy), κάτι που είναι απαραίτητο για τη διαχείριση μεγάλων αρχείων. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Γιατί είναι σημαντικό:** +Η δημιουργία του αντικειμένου `HTMLDocument` δεν διαβάζει αμέσως ολόκληρο το αρχείο στη μνήμη. Αντίθετα, προετοιμάζει έναν streaming parser που θα αντλεί δεδομένα από το δίσκο όπως απαιτείται. Αυτός ο σχεδιασμός σας επιτρέπει να εργάζεστε με αρχεία που υπερβαίνουν τη RAM του υπολογιστή σας. + +## Βήμα 2: Ενεργοποιήστε το streaming με HtmlSaveOptions + +Για να διατηρήσετε το αποτύπωμα μνήμης χαμηλό ενώ χειρίζεστε ή αποθηκεύετε το έγγραφο, πρέπει να ενεργοποιήσετε τη λειτουργία streaming στο `HtmlSaveOptions`. Αυτή η δευτερεύουσα λέξη‑κλειδί, **HtmlSaveOptions**, ελέγχει πώς η βιβλιοθήκη γράφει το αρχείο εξόδου. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Γιατί να ενεργοποιήσετε το streaming;** +Όταν το `enable_streaming` είναι ορισμένο σε `True`, η βιβλιοθήκη γράφει το αποτέλεσμα σε κομμάτια αντί να αποθηκεύει ολόκληρο το αποτέλεσμα στη μνήμη. Αυτό είναι κρίσιμο όταν αργότερα **αποθηκεύσετε το έγγραφο** ή εκτελέσετε μετασχηματισμούς σε **μεγάλα αρχεία HTML**. + +## Βήμα 3: Αποθηκεύστε το έγγραφο με τις ρυθμισμένες επιλογές + +Τώρα που το streaming είναι ενεργό, μπορείτε με ασφάλεια να γράψετε το επεξεργασμένο περιεχόμενο σε ένα νέο αρχείο. Η μέθοδος `save` σέβεται τις `HtmlSaveOptions` που ρυθμίσαμε, διασφαλίζοντας ότι η λειτουργία παραμένει αποδοτική στη μνήμη. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Τι συμβαίνει στο παρασκήνιο:** +Η κλήση `save` στέλνει τη σήμανση HTML στο `large_out.html` κομμάτι‑κομμάτι. Επειδή το έγγραφο φορτώθηκε με τον streaming parser, ολόκληρη η αλυσίδα — από τη φόρτωση μέχρι την αποθήκευση — λειτουργεί με σταθερή, χαμηλή χρήση μνήμης. + +## Πλήρες λειτουργικό παράδειγμα + +Συνδυάζοντας τα τρία βήματα παίρνετε ένα συμπαγές script που μπορείτε να εκτελέσετε απευθείας από τη γραμμή εντολών: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Αναμενόμενη έξοδος** + +Όταν εκτελέσετε το script (`python load_html_document_streaming.py`), θα πρέπει να δείτε: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Το αρχείο `large_out.html` θα είναι μια πιστή αντίγραφο του αρχικού, αλλά επεξεργάστηκε χωρίς ποτέ να φορτωθεί ολόκληρο το αρχείο στη RAM. + +## Συχνές ερωτήσεις και διαχείριση ειδικών περιπτώσεων + +### Λειτουργεί αυτό με αρχεία HTML που περιέχουν εξωτερικούς πόρους (εικόνες, CSS, scripts); + +Ναι. Ο streaming parser αντιμετωπίζει τις εξωτερικές αναφορές ως συνηθισμένα attributes. **Δεν** κατεβάζει τους πόρους εκτός αν το ζητήσετε ρητά. Αν χρειάζεται να ενσωματώσετε αυτούς τους πόρους, μπορείτε να χρησιμοποιήσετε πρόσθετα APIs από το `aspose.html` μετά τη φόρτωση του εγγράφου. + +### Τι γίνεται αν το αρχείο προέλευσης είναι κατεστραμμένο ή δεν είναι καλά σχηματισμένο HTML; + +`HTMLDocument` θα προσπαθήσει να ανακτήσει από μικρά σφάλματα, αλλά σοβαρές παραμορφώσεις προκαλούν εξαίρεση. Τυλίξτε το βήμα φόρτωσης σε ένα μπλοκ `try/except` για να διαχειριστείτε τέτοιες περιπτώσεις με χάρη: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Μπορώ να τροποποιήσω το DOM πριν την αποθήκευση; + +Απόλυτα. Μετά τη φόρτωση, έχετε πλήρη πρόσβαση στο δέντρο DOM (`html_doc.dom`). Μπορείτε να εισάγετε κόμβους, να αφαιρέσετε στοιχεία ή να τροποποιήσετε attributes, και στη συνέχεια να καλέσετε `save` με το streaming ακόμα ενεργό. Η χρήση μνήμης θα παραμείνει χαμηλή επειδή οι αλλαγές εφαρμόζονται σταδιακά. + +### Επηρεάζει το streaming την ποιότητα του αποτελέσματος; + +Όχι. Το streamed αποτέλεσμα είναι byte‑for‑byte ταυτόσημο με αυτό που θα λάβετε από μια αποθήκευση χωρίς streaming, εφόσον δεν έχετε κάνει τροποποιήσεις στο DOM. Το streaming αλλάζει μόνο τον τρόπο με τον οποίο γράφεται το δεδομένο, όχι το περιεχόμενο. + +## Συμβουλή απόδοσης: μέτρηση χρήσης μνήμης + +Αν θέλετε να επαληθεύσετε ότι το streaming μειώνει πραγματικά τη χρήση μνήμης, μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Θα δείτε συνήθως μόνο λίγα megabytes RAM σε χρήση, ακόμη και για αρχεία HTML 500 MB. + +## Συμπέρασμα + +Σε αυτό το tutorial μάθατε πώς να **φορτώσετε έγγραφο html** αποδοτικά σε Python με: + +1. Δημιουργία παρουσίας `HTMLDocument` για την αργή (lazy) ανάλυση του αρχείου. +2. Ρύθμιση του `HtmlSaveOptions` με `enable_streaming = True` για εγγραφές χαμηλής μνήμης. +3. Αποθήκευση του εγγράφου ενώ το αποτέλεσμα μεταδίδεται (streaming) στο δίσκο. + +Αυτά τα τρία βήματα σας παρέχουν ένα αξιόπιστο μοτίβο για την επεξεργασία **μεγάλων αρχείων HTML** χρησιμοποιώντας τεχνικές **επεξεργασίας HTML με Python**. Από εδώ μπορείτε να επεκτείνετε το script για να τροποποιήσετε το DOM, να εξάγετε δεδομένα ή να επεξεργαστείτε κατά παρτίδες δεκάδες αρχεία — όλα ενώ η χρήση μνήμης παραμένει προβλέψιμη. + +**Επόμενα βήματα** + +* Εξερευνήστε το DOM API του `aspose.html` για εξαγωγή πινάκων, συνδέσμων ή εικόνων. +* Συνδυάστε αυτήν την προσέγγιση με multithreading για επεξεργασία πολλαπλών αρχείων ταυτόχρονα. +* Εξετάστε το `HtmlLoadOptions` αν χρειάζεστε έλεγχο της κωδικοποίησης χαρακτήρων ή άλλων λεπτομερειών ανάλυσης. + +Καλές προγραμματιστικές δουλειές, και απολαύστε τον φιλικό προς τη μνήμη τρόπο να **φορτώνετε έγγραφο html** σε μεγάλη κλίμακα! + +## Τι πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που βασίζονται στις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσουν να κατακτήσετε πρόσθετες δυνατότητες του API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Φόρτωση εγγράφου HTML Java – Πλήρης οδηγός με XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Φόρτωση HTML χρησιμοποιώντας URL σε .NET με Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Πώς να ενεργοποιήσετε JavaScript στο Aspose HTML – Φόρτωση HTML & Λήψη κειμένου](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/hindi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..8cce76cff7 --- /dev/null +++ b/html/hindi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: Python में HTML को Markdown में बदलें, एक पूर्ण उदाहरण के साथ। जानें + कि HTML को Markdown के रूप में कैसे सहेजें, फ़ॉर्मैटर चुनें, और विशिष्ट सुविधाएँ + सक्षम करें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: hi +lastmod: 2026-10-02 +og_description: व्यावहारिक कोड, फ़ॉर्मैटर विकल्प और फीचर फ़्लैग्स के साथ Python में + HTML को Markdown में बदलें। इस गाइड का पालन करके HTML को जल्दी से Markdown में सहेजें। +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Python में HTML को Markdown में परिवर्तित करें – पूर्ण ट्यूटोरियल +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Python में HTML को Markdown में कैसे बदलें – चरण‑दर‑चरण गाइड +url: /hi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python में HTML को Markdown में कैसे बदलें – चरण‑दर‑चरण गाइड + +यदि आपको **HTML को Markdown में बदलना** है, तो यह गाइड आपको Python में एक पूर्ण, चलाने योग्य समाधान दिखाता है। आप देखेंगे कि **HTML को Markdown के रूप में कैसे सहेजें**, सही फ़ॉर्मेटर कैसे चुनें, और केवल वही फीचर कैसे सक्षम करें जिनकी आपको ज़रूरत है। + +HTML को Markdown में बदलना एक सामान्य कार्य है जब आप हल्का दस्तावेज़ीकरण, स्थैतिक‑साइट सामग्री, या संस्करण‑नियंत्रित टेक्स्ट फ़ाइलें चाहते हैं। यह ट्यूटोरियल लाइब्रेरी को इंस्टॉल करने से लेकर एज केसों को संभालने तक सब कुछ कवर करता है, ताकि आप इस तकनीक को किसी भी HTML स्रोत पर लागू कर सकें। + +## आवश्यकताएँ + +शुरू करने से पहले सुनिश्चित करें कि आपके पास है: + +* Python 3.8 या उससे नया इंस्टॉल किया हुआ। +* `pip` का एक्सेस ताकि थर्ड‑पार्टी पैकेज इंस्टॉल कर सकें। +* HTML टैग और Markdown सिंटैक्स की बुनियादी समझ। + +कोई अतिरिक्त सिस्टम डिपेंडेंसीज़ नहीं चाहिए क्योंकि यह कन्वर्ज़न लाइब्रेरी शुद्ध Python में है। + +## GroupDocs Conversion लाइब्रेरी इंस्टॉल करें + +कोड सैंपल **GroupDocs.Conversion** Python पैकेज का उपयोग करता है, जो `HTMLDocument`, `MarkdownSaveOptions`, और `Converter` प्रदान करता है। इसे इस प्रकार इंस्टॉल करें: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** एक वर्चुअल एनवायरनमेंट (`python -m venv venv`) का उपयोग करें ताकि पैकेज को अन्य प्रोजेक्ट्स से अलग रखा जा सके। + +## Step 1: `HTMLDocument` को स्ट्रिंग से बनाएं + +पहला कदम है अपनी कच्ची HTML को `HTMLDocument` इंस्टेंस में लपेटना। यह ऑब्जेक्ट स्रोत को एब्स्ट्रैक्ट करता है, चाहे वह स्ट्रिंग, फ़ाइल, या रिमोट URL से आए। + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Why this matters:* `HTMLDocument` मार्कअप को एक बार पार्स करता है, जिससे कन्वर्टर को कच्चे टेक्स्ट की बजाय एक सामान्यीकृत प्रतिनिधित्व के साथ काम करने की सुविधा मिलती है। + +## Step 2: `MarkdownSaveOptions` को कॉन्फ़िगर करें + +`MarkdownSaveOptions` आपको आउटपुट फ़ॉर्मेट और कौन‑से Markdown फीचर एमीट किए जाएँ, को नियंत्रित करने देता है। लाइब्रेरी दो फ़ॉर्मेटर सपोर्ट करती है: + +* **DEFAULT** – मानक CommonMark‑संगत Markdown। +* **GIT** – Git‑फ़्लेवर्ड Markdown (टेबल, स्ट्राइकथ्रू आदि जोड़ता है)। + +अधिकांश संस्करण‑नियंत्रण परिदृश्यों के लिए **GIT** फ़ॉर्मेटर पसंद किया जाता है। + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### केवल आवश्यक फीचर सक्षम करना + +आप आउटपुट को विशिष्ट फीचर फ़्लैग्स को ऑन करके फाइन‑ट्यून कर सकते हैं। इस उदाहरण में हम **links** और **paragraphs** को रखते हैं जबकि images, tables, और अन्य संरचनाओं को डिसेबल करते हैं। + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Why this matters:* फीचर को सीमित करने से जेनरेटेड फ़ाइल का आकार घटता है और अप्रत्याशित Markdown एलिमेंट्स को रोकता है जो डाउनस्ट्रीम टूल्स सपोर्ट नहीं कर सकते। + +## Step 3: दस्तावेज़ को कन्वर्ट करें + +स्रोत `HTMLDocument` और कॉन्फ़िगर किए हुए `MarkdownSaveOptions` के साथ, कन्वर्ज़न एक ही कॉल `Converter.convert` से होता है। आउटपुट फ़ाइल के लिए एक एब्सॉल्यूट या रिलेटिव पाथ प्रदान करें। + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +कॉल समाप्त होने के बाद, `output.md` में मूल HTML का Markdown प्रतिनिधित्व होगा। + +## आज ही चलाने योग्य पूर्ण स्क्रिप्ट + +नीचे वह संपूर्ण, स्व‑निर्भर स्क्रिप्ट है जो सभी पिछले चरणों को सम्मिलित करती है। इसे `html_to_md.py` के रूप में सहेजें और `python html_to_md.py` चलाएँ। + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### अपेक्षित आउटपुट (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +आउटपुट मूल HTML संरचना से मेल खाता है जबकि केवल वही फीचर दिखाता है जिन्हें हमने सक्षम किया (links, paragraphs, और lists)। + +## सामान्य एज केसों को संभालना + +### गायब या गलत `href` एट्रिब्यूट्स + +यदि `` टैग में वैध `href` नहीं है, तो कन्वर्टर लिंक टेक्स्ट को URL के बिना डाल देता है। पठनीयता बनाए रखने के लिए आप Markdown को पोस्ट‑प्रोसेस कर सकते हैं: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### बड़े HTML फ़ाइलों को कन्वर्ट करना + +मल्टी‑मेगाबाइट HTML फ़ाइलों के लिए, इनपुट को स्ट्रीम करें ताकि पूरी मार्कअप को मेमोरी में लोड करने से बचा जा सके: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +कन्वर्ज़न प्रक्रिया स्वयं अपरिवर्तित रहती है क्योंकि `HTMLDocument` स्रोत के आकार को एब्स्ट्रैक्ट करता है। + +## वैकल्पिक फ़ॉर्मेटर + +यदि आप Git‑फ़्लेवर्ड आउटपुट के बजाय साधारण CommonMark पसंद करते हैं, तो फ़ॉर्मेटर बदलें: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +यह एक अधिक न्यूनतम Markdown फ़ाइल देता है, जो उन प्लेटफ़ॉर्म्स के लिए उपयोगी है जो Git एक्सटेंशन सपोर्ट नहीं करते। + +## संबंधित कार्य जिन्हें आप आगे एक्सप्लोर कर सकते हैं + +* **Markdown को फिर से HTML में बदलें** – दस्तावेज़ीकरण का प्रीव्यू लेने के लिए उपयोगी। +* **HTML को PDF में एक्सपोर्ट करें** – एक और सामान्य **html to markdown conversion**‑संबंधित वर्कफ़्लो। +* **HTML फ़ाइलों के फ़ोल्डर को बैच प्रोसेस करें** – फ़ाइलों पर लूप चलाएँ और वही `MarkdownSaveOptions` इंस्टेंस पुन: उपयोग करें। + +इन सभी में वही पैटर्न दोहराया जाता है: स्रोत दस्तावेज़ बनाएं, सेव ऑप्शन कॉन्फ़िगर करें, और `Converter.convert` को कॉल करें। + +## निष्कर्ष + +अब आप जानते हैं कि Python में **HTML को Markdown में कैसे बदलें**, **HTML को Markdown के रूप में कैसे सहेजें** सटीक फीचर कंट्रोल के साथ, और क्यों सही फ़ॉर्मेटर चुनना डाउनस्ट्रीम टूल्स के लिए महत्वपूर्ण है। यह उदाहरण एक साफ़, पुन: उपयोग योग्य दृष्टिकोण दिखाता है जो स्ट्रिंग, फ़ाइल, या URL के लिए काम करता है, और इसमें गायब लिंक और बड़े इनपुट को संभालने के टिप्स शामिल हैं। + +अतिरिक्त `MarkdownSaveOptions.Features` (जैसे `IMAGE`, `TABLE`) के साथ प्रयोग करने में संकोच न करें ताकि आउटपुट को अपने प्रोजेक्ट की आवश्यकताओं के अनुसार ट्यून कर सकें। यदि आपको यह गाइड उपयोगी लगा, तो इसे टीम के साथ शेयर करें या अपने प्रोजेक्ट दस्तावेज़ में लिंक करें। खुशहाल कन्वर्ज़न! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/hindi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..bd763c3092 --- /dev/null +++ b/html/hindi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Python में SVG दस्तावेज़ बनाना, SVG को फ़ाइल में सहेजना, और एक छोटा, + पूर्ण स्क्रिप्ट के साथ SVG छवि निर्यात करना सीखें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: hi +lastmod: 2026-10-02 +og_description: Python में SVG दस्तावेज़ बनाएं और इस व्यावहारिक ट्यूटोरियल के साथ + SVG छवि निर्यात करें। स्क्रिप्ट का पालन करें, SVG को फ़ाइल में सहेजें, और वेक्टर + ग्राफ़िक को तुरंत पुनः उपयोग करें। +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Python में SVG दस्तावेज़ बनाएं – चरण‑दर‑चरण मार्गदर्शिका +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Python में SVG दस्तावेज़ कैसे बनाएं और इसे छवि के रूप में निर्यात करें +url: /hi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python में SVG दस्तावेज़ बनाना और उसे इमेज के रूप में एक्सपोर्ट करना + +यदि आपको प्रोग्रामेटिक रूप से **SVG दस्तावेज़ बनाना** है, तो यह ट्यूटोरियल आपको Python के साथ इसे कैसे करना है, दिखाता है। आप एक पूर्ण स्क्रिप्ट देखेंगे जो एक साधारण सर्कल बनाता है, SVG को फ़ाइल में सहेजता है, और एक एक्सपोर्टेबल SVG इमेज उत्पन्न करता है जिसे आप कहीं भी एम्बेड कर सकते हैं। + +कोड से स्केलेबल वेक्टर ग्राफ़िक्स जेनरेट करने से GUI एडिटर में मैन्युअल रूप से शैप ड्रॉ करने की मेहनत बचती है। इस गाइड के अंत तक आप SVG निर्माण को डेटा‑विज़ुअलाइज़ेशन पाइपलाइन, ऑटोमेटेड रिपोर्ट जेनरेटर, या किसी भी प्रोजेक्ट में इंटीग्रेट कर सकते हैं जिसे स्पष्ट, रिज़ॉल्यूशन‑इंडिपेंडेंट ग्राफ़िक्स चाहिए। + +## पूर्वापेक्षाएँ + +शुरू करने से पहले सुनिश्चित करें कि आपके पास है: + +- Python 3.8 या नया संस्करण स्थापित हो +- `svgwrite` लाइब्रेरी (इंस्टॉल करने के लिए `pip install svgwrite` चलाएँ) +- वह डायरेक्टरी जहाँ SVG सहेजा जाएगा, उसमें लिखने की अनुमति + +इन आवश्यकताओं से उदाहरण हल्का और अधिकांश वातावरण के साथ संगत रहता है। + +## चरण 1: SVG लाइब्रेरी इंस्टॉल और इम्पोर्ट करें + +पहला कदम है थर्ड‑पार्टी लाइब्रेरी जोड़ना जो SVG निर्माण के लिए सुविधाजनक API प्रदान करती है। + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` SVG फ़ाइल की XML संरचना को एब्स्ट्रैक्ट करता है, जिससे आप कच्चे मार्कअप की बजाय ज्योमेट्री पर ध्यान केंद्रित कर सकते हैं। + +## चरण 2: SVG दस्तावेज़ ऑब्जेक्ट बनाएं + +अब आप `svgwrite.Drawing` को इंस्टैंशिएट करके **SVG दस्तावेज़ बनाना** शुरू कर सकते हैं। यह ऑब्जेक्ट रूट `` एलिमेंट का प्रतिनिधित्व करता है और सभी बाद के शैप्स को रखता है। + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` आर्ग्यूमेंट रेंडर किए गए पिक्सेल आयाम निर्धारित करता है, जबकि `viewBox` एक कोऑर्डिनेट सिस्टम स्थापित करता है जो बाद में आप परिभाषित करेंगे वाली ज्योमेट्री से मेल खाता है। + +## चरण 3: सर्कल एलिमेंट जोड़ें + +एक सर्कल उसके केंद्र (`cx`, `cy`) और त्रिज्या (`r`) द्वारा परिभाषित होता है। इन एट्रिब्यूट्स को अटैच करने के लिए `circle` हेल्पर का उपयोग करें। + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +सर्कल 100 × 100 कैनवास के मध्य में स्थित है, प्रत्येक पक्ष पर 10‑पिक्सेल मार्जिन छोड़ते हुए। अपने डिज़ाइन भाषा के अनुसार `fill` और `stroke` को समायोजित करें। + +## चरण 4: SVG को फ़ाइल में सहेजें + +ग्राफ़िक तैयार होने के बाद, आप `save` मेथड का उपयोग करके **SVG को फ़ाइल में सहेजें** सकते हैं। यह एक वैध XML लिखता है जिसे ब्राउज़र और वेक्टर एडिटर समझते हैं। + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +फ़ाइल `circle.svg` अब वर्तमान कार्यशील डायरेक्टरी में मौजूद है। आप इसे वेब ब्राउज़र, Inkscape, या किसी भी टूल में खोल सकते हैं जो SVG फ़ॉर्मेट को सपोर्ट करता है। + +## चरण 5: एक्सपोर्टेड SVG इमेज की जाँच करें + +सहेजी गई फ़ाइल को ब्राउज़र में खोलें और आउटपुट की पुष्टि करें। आपको निर्दिष्ट रंगों के साथ केंद्रित सर्कल दिखना चाहिए। कच्चा XML इस प्रकार दिखता है: + +```xml + + + + +``` + +क्योंकि SVG वेक्टर‑आधारित है, आप इमेज को गुणवत्ता खोए बिना स्केल कर सकते हैं, जो रिस्पॉन्सिव वेब डिज़ाइन्स या हाई‑रेज़ॉल्यूशन प्रिंट के लिए आदर्श है। + +## प्रो टिप: SVG को PNG या JPEG में एक्सपोर्ट करें + +यदि आपको रास्टर संस्करण चाहिए, तो SVG फ़ाइल को **CairoSVG** जैसे कन्वर्ज़न टूल के साथ मिलाएँ: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +यह चरण **SVG इमेज को एक्सपोर्ट** करके बिटमैप फ़ॉर्मेट में बदलता है, जो तब उपयोगी होता है जब डाउनस्ट्रीम सिस्टम सीधे SVG रेंडर नहीं कर पाते। + +## सामान्य वैरिएशन्स और एज केस + +| वैरिएशन | कैसे संभालें | +|-----------|---------------| +| कई शैप्स | प्रत्येक नए एलिमेंट (rect, line, path) के लिए `dwg.add()` कॉल करें। | +| डायनामिक डाइमेंशन्स | `Drawing` बनाने से पहले डेटा से `size` और `viewBox` की गणना करें। | +| टेक्स्ट लेबल्स | `dwg.text("Label", insert=("10", "20"))` का उपयोग करें और `font_size` तथा `fill` से स्टाइल करें। | +| दस्तावेज़ का पुनः उपयोग | `Drawing` ऑब्जेक्ट को मेमोरी में रखें और जब भी अपडेटेड फ़ाइल चाहिए, `save()` कॉल करें। | +| बड़ी फ़ाइलें | आउटपुट को `dwg.tostring()` से स्ट्रीम करें और मेमोरी स्पाइक से बचने के लिए मैन्युअली फ़ाइल ऑब्जेक्ट में लिखें। | + +इन परिदृश्यों को संभालने से आपका **SVG जेनरेट करने का** स्क्रिप्ट साधारण आइकन्स से लेकर जटिल डायग्राम तक स्केल हो जाता है। + +## पूर्ण स्क्रिप्ट पुनरावलोकन + +नीचे वह पूर्ण, चलाने योग्य उदाहरण है जिसमें सभी चरण और वैकल्पिक कन्वर्ज़न शामिल हैं: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +इस स्क्रिप्ट को चलाने पर `circle.svg` और, यदि `cairosvg` स्थापित है, तो `circle.png` बनेंगे। दोनों फ़ाइलें वेब पेज, रिपोर्ट, या आगे की प्रोसेसिंग के लिए तैयार हैं। + +## निष्कर्ष + +अब आप जानते हैं कि Python में **SVG दस्तावेज़ बनाना**, **SVG को फ़ाइल में सहेजना**, और **SVG इमेज को एक्सपोर्ट करना** कैसे है। उदाहरण ने आवश्यक API कॉल्स को कवर किया, प्रत्येक चरण के महत्व को समझाया, और अधिक जटिल ग्राफ़िक्स के लिए विस्तार प्रदान किए। + +आगे, अतिरिक्त **SVG Python ट्यूटोरियल** विषयों जैसे पाथ ड्रॉइंग, ग्रेडिएंट्स लागू करना, और एनीमेशन पर खोज करें। इन तकनीकों को इंटीग्रेट करने से आप अपने Python एप्लिकेशन से डायनामिक, डेटा‑ड्रिवेन वेक्टर ग्राफ़िक्स सीधे जेनरेट कर पाएँगे। Happy coding! + +## आगे क्या सीखें? + +निम्नलिखित ट्यूटोरियल्स उन विषयों को कवर करते हैं जो इस गाइड में प्रदर्शित तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं, जिससे आप अतिरिक्त API फीचर्स में महारत हासिल कर सकें और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन अप्रोचेज़ का अन्वेषण कर सकें। + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/hindi/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..2b776fae8e --- /dev/null +++ b/html/hindi/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Python में HtmlSaveOptions और स्ट्रीमिंग का उपयोग करके HTML दस्तावेज़ + को लोड करना सीखें और बड़े HTML फ़ाइलों को कुशलतापूर्वक प्रोसेस करें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: hi +lastmod: 2026-10-02 +og_description: HtmlSaveOptions और स्ट्रीमिंग का उपयोग करके Python में HTML दस्तावेज़ + लोड करें। यह ट्यूटोरियल बड़े HTML फ़ाइलों के लिए एक पूर्ण, तैयार‑चलाने‑योग्य समाधान + दिखाता है। +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Python में स्ट्रीमिंग के साथ HTML दस्तावेज़ लोड करें – चरण‑दर‑चरण मार्गदर्शिका +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Python में स्ट्रीमिंग के साथ HTML दस्तावेज़ कैसे लोड करें +url: /hi/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python में स्ट्रीमिंग के साथ HTML दस्तावेज़ लोड करना + +यदि आपको कई सौ मेगाबाइट या उससे बड़े **load html document** फ़ाइलों को लोड करने की आवश्यकता है, तो आप जल्दी ही मेमोरी‑उपयोग समस्याओं का सामना करेंगे। यह गाइड आपको एक पूर्ण, तुरंत चलाने योग्य समाधान दिखाता है जो **HTML streaming** का उपयोग करके मेमोरी खपत को कम रखता है जबकि दस्तावेज़ की सामग्री तक पूर्ण पहुँच प्रदान करता है। + +आप सीखेंगे कि `HtmlSaveOptions` को कैसे कॉन्फ़िगर करें, स्ट्रीमिंग को सक्षम करें, और प्रोसेस की गई फ़ाइल को सहेजें—सिर्फ तीन संक्षिप्त चरणों में। मानक `aspose.html` Python पैकेज के अलावा कोई बाहरी टूल आवश्यक नहीं है, जिससे यह तरीका बैच जॉब्स, सर्वर‑साइड पाइपलाइन्स, या स्थानीय स्क्रिप्ट्स के लिए आदर्श बनता है जो **large HTML files** को संभालते हैं। + +## आवश्यकताएँ + +* Python 3.8 या उससे नया स्थापित हो। +* `aspose.html` लाइब्रेरी (`pip install aspose-html`) – यह `HTMLDocument` और `HtmlSaveOptions` प्रदान करती है। +* एक डायरेक्टरी जिसमें वह बड़ा HTML फ़ाइल हो जिसे आप काम करना चाहते हैं (उदाहरण के लिए `large.html`). + +ये आवश्यकताएँ न्यूनतम हैं, इसलिए आप बड़े HTML दस्तावेज़ को कुशलतापूर्वक लोड करने के मूल तर्क पर ध्यान केंद्रित कर सकते हैं। + +## चरण 1: HTML दस्तावेज़ लोड करें + +पहला कार्य `HTMLDocument` इंस्टेंस बनाना है जो स्रोत फ़ाइल की ओर संकेत करता है। यह ऑब्जेक्ट **load html document** ऑपरेशन को दर्शाता है और मार्कअप को लेज़ी तरीके से पार्स करता है, जो बड़े फ़ाइलों को संभालने के लिए आवश्यक है। + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**यह क्यों महत्वपूर्ण है:** +`HTMLDocument` ऑब्जेक्ट बनाते समय पूरी फ़ाइल को तुरंत मेमोरी में नहीं पढ़ा जाता। इसके बजाय, यह एक स्ट्रीमिंग पार्सर तैयार करता है जो आवश्यकता अनुसार डिस्क से डेटा खींचेगा। यह डिज़ाइन आपको उन फ़ाइलों के साथ काम करने देता है जो आपके मशीन की RAM से अधिक हैं। + +## चरण 2: HtmlSaveOptions के साथ स्ट्रीमिंग सक्षम करें + +दस्तावेज़ को संशोधित या सहेजते समय मेमोरी फुटप्रिंट को कम रखने के लिए, आपको `HtmlSaveOptions` पर स्ट्रीमिंग मोड को सक्षम करना होगा। यह द्वितीयक कीवर्ड, **HtmlSaveOptions**, लाइब्रेरी को आउटपुट फ़ाइल लिखने के तरीके को नियंत्रित करता है। + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**स्ट्रीमिंग क्यों सक्षम करें?** +`enable_streaming` को `True` पर सेट करने पर, लाइब्रेरी आउटपुट को चंक्स में लिखती है बजाय पूरी परिणाम को मेमोरी में बफ़र करने के। यह तब महत्वपूर्ण होता है जब आप बाद में **save the document** करते हैं या **large HTML files** पर परिवर्तन करते हैं। + +## चरण 3: कॉन्फ़िगर किए गए विकल्पों के साथ दस्तावेज़ को सहेजें + +अब जब स्ट्रीमिंग सक्रिय है, आप सुरक्षित रूप से प्रोसेस की गई सामग्री को नई फ़ाइल में लिख सकते हैं। `save` मेथड हमारे द्वारा कॉन्फ़िगर किए गए `HtmlSaveOptions` का सम्मान करता है, जिससे ऑपरेशन मेमोरी‑कुशल बना रहता है। + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**पर्दे के पीछे क्या होता है:** +`save` कॉल HTML मार्कअप को `large_out.html` में टुकड़ा‑टुकड़ा स्ट्रीम करता है। क्योंकि दस्तावेज़ को स्ट्रीमिंग पार्सर के साथ लोड किया गया था, पूरी पाइपलाइन—लोड से लेकर सेव तक—एक स्थिर, कम मेमोरी उपयोग के साथ काम करती है। + +## पूर्ण कार्यशील उदाहरण + +तीन चरणों को मिलाकर आपको एक संक्षिप्त स्क्रिप्ट मिलती है जिसे आप कमांड लाइन से सीधे चला सकते हैं: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**अपेक्षित आउटपुट** + +जब आप स्क्रिप्ट चलाते हैं (`python load_html_document_streaming.py`), आपको यह दिखना चाहिए: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` फ़ाइल मूल की एक सटीक प्रति होगी, लेकिन इसे पूरी फ़ाइल को RAM में लोड किए बिना प्रोसेस किया गया है। + +## सामान्य प्रश्न और किनारे‑केस हैंडलिंग + +### क्या यह उन HTML फ़ाइलों के साथ काम करता है जिनमें बाहरी संसाधन (इमेज, CSS, स्क्रिप्ट) होते हैं? + +हां। स्ट्रीमिंग पार्सर बाहरी रेफ़रेंसेज़ को सामान्य एट्रिब्यूट्स की तरह मानता है। यह संसाधनों को **डाउनलोड नहीं** करता जब तक आप स्पष्ट रूप से अनुरोध न करें। यदि आपको उन संसाधनों को एम्बेड करना है, तो आप दस्तावेज़ लोड होने के बाद `aspose.html` की अतिरिक्त APIs का उपयोग कर सकते हैं। + +### यदि स्रोत फ़ाइल भ्रष्ट है या सही‑फ़ॉर्मेटेड HTML नहीं है तो क्या होगा? + +`HTMLDocument` छोटे त्रुटियों से पुनः प्राप्त करने का प्रयास करेगा, लेकिन गंभीर विकृतियों पर एक एक्सेप्शन उठाया जाता है। ऐसे मामलों को सुगमता से संभालने के लिए लोड चरण को `try/except` ब्लॉक में रखें: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### क्या मैं सहेजने से पहले DOM को संशोधित कर सकता हूँ? + +बिल्कुल। लोड करने के बाद, आपके पास DOM ट्री (`html_doc.dom`) तक पूरी पहुँच होती है। आप नोड्स डाल सकते हैं, एलिमेंट्स हटा सकते हैं, या एट्रिब्यूट्स बदल सकते हैं, और फिर `save` को कॉल कर सकते हैं जबकि स्ट्रीमिंग अभी भी सक्षम है। मेमोरी उपयोग कम रहेगा क्योंकि परिवर्तन क्रमिक रूप से लागू होते हैं। + +### क्या स्ट्रीमिंग आउटपुट की गुणवत्ता को प्रभावित करती है? + +नहीं। स्ट्रीम्ड आउटपुट बाइट‑दर‑बाइट वही होता है जो आप नॉन‑स्ट्रीमिंग सेव से प्राप्त करेंगे, बशर्ते आपने कोई DOM संशोधन नहीं किया हो। स्ट्रीमिंग केवल डेटा लिखने के तरीके को बदलती है, न कि लिखी गई सामग्री को। + +## प्रदर्शन टिप: मेमोरी उपयोग मापें + +यदि आप सत्यापित करना चाहते हैं कि स्ट्रीमिंग वास्तव में मेमोरी खपत को कम करती है, तो आप `psutil` लाइब्रेरी का उपयोग कर सकते हैं: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +आप आमतौर पर देखेंगे कि 500 MB HTML फ़ाइलों के लिए भी केवल कुछ मेगाबाइट RAM उपयोग हो रहा है। + +## निष्कर्ष + +इस ट्यूटोरियल में आपने Python में **load html document** को कुशलतापूर्वक करने का तरीका सीखा: + +1. `HTMLDocument` को इंस्टैंसिएट करके फ़ाइल को लेज़ी तरीके से पार्स करना। +2. `HtmlSaveOptions` को `enable_streaming = True` के साथ कॉन्फ़िगर करना ताकि कम‑मेमोरी लिखावट हो। +3. डॉक्यूमेंट को सहेजना जबकि आउटपुट को डिस्क पर स्ट्रीम किया जाता है। + +ये तीन चरण आपको **large HTML files** को **Python HTML processing** तकनीकों का उपयोग करके प्रोसेस करने का एक मजबूत पैटर्न देते हैं। यहाँ से आप स्क्रिप्ट को DOM संशोधित करने, डेटा निकालने, या दर्जनों फ़ाइलों को बैच‑प्रोसेस करने के लिए विस्तारित कर सकते हैं—सभी मेमोरी उपयोग को पूर्वानुमेय रखते हुए। + +**अगले कदम** + +- `aspose.html` DOM API का अन्वेषण करें ताकि टेबल, लिंक, या इमेजेज़ निकाल सकें। +- इस दृष्टिकोण को मल्टीथ्रेडिंग के साथ मिलाकर कई फ़ाइलों को समानांतर में प्रोसेस करें। +- `HtmlLoadOptions` देखें यदि आपको कैरेक्टर एन्कोडिंग या अन्य पार्सिंग नुअन्सेज़ को नियंत्रित करने की आवश्यकता है। + +कोडिंग का आनंद लें, और स्केल पर **load html document** करने का मेमोरी‑फ्रेंडली तरीका अपनाएँ! + +## आगे आप क्या सीखें? + +निम्नलिखित ट्यूटोरियल्स उन निकट-संबंधित विषयों को कवर करते हैं जो इस गाइड में दिखाए गए तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं जो आपको अतिरिक्त API फीचर्स में महारत हासिल करने और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन अप्रोचेज़ का अन्वेषण करने में मदद करती हैं। + +- [HTML दस्तावेज़ लोड करना Java – XPath & CSS के साथ पूर्ण गाइड](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [URL के माध्यम से HTML लोड करना .NET में Aspose.HTML के साथ](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Aspose HTML में JavaScript कैसे सक्षम करें – HTML लोड करें और टेक्स्ट प्राप्त करें](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/hongkong/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..d3638f7b69 --- /dev/null +++ b/html/hongkong/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-10-02 +description: 在 Python 中將 HTML 轉換為 Markdown,附完整範例。學習如何將 HTML 儲存為 Markdown、選擇格式化程式,並啟用特定功能。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: zh-hant +lastmod: 2026-10-02 +og_description: 在 Python 中將 HTML 轉換為 Markdown,提供實用程式碼、格式化選項和功能旗標。遵循本指南,快速將 HTML 儲存為 + Markdown。 +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: 將 HTML 轉換為 Markdown(Python)– 完整教學 +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: 如何在 Python 中將 HTML 轉換為 Markdown – 步驟指南 +url: /zh-hant/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中將 HTML 轉換為 Markdown – 步驟教學 + +如果你需要 **將 HTML 轉換為 Markdown**,本指南將示範一個完整、可直接執行的 Python 解決方案。你將學會 **將 HTML 儲存為 Markdown**、選擇合適的 formatter,並只啟用你需要的功能。 + +將 HTML 轉換為 Markdown 是在需要輕量文件、靜態網站內容或版本控制文字檔時的常見需求。本教學涵蓋從安裝函式庫到處理各種邊緣情況,讓你能將此技巧套用於任何 HTML 來源。 + +## 前置條件 + +開始之前,請確保你已具備: + +* 已安裝 Python 3.8 或更新版本。 +* 可使用 `pip` 安裝第三方套件。 +* 具備 HTML 標籤與 Markdown 語法的基本認識。 + +不需要額外的系統相依性,因為轉換函式庫是純 Python 實作。 + +## 安裝 GroupDocs Conversion 函式庫 + +程式範例使用 **GroupDocs.Conversion** Python 套件,提供 `HTMLDocument`、`MarkdownSaveOptions` 與 `Converter`。使用以下指令安裝: + +```bash +pip install groupdocs-conversion +``` + +> **專業提示:** 使用虛擬環境(`python -m venv venv`)可將套件與其他專案隔離。 + +## 步驟 1:從字串建立 `HTMLDocument` + +第一步是將原始 HTML 包裝成 `HTMLDocument` 物件。此物件會抽象化來源,無論是字串、檔案或遠端 URL。 + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*為什麼這很重要:* `HTMLDocument` 只會解析一次標記,讓轉換器能以正規化的表示方式工作,而非直接處理原始文字。 + +## 步驟 2:設定 `MarkdownSaveOptions` + +`MarkdownSaveOptions` 讓你控制輸出格式以及要產生的 Markdown 功能。函式庫支援兩種 formatter: + +* **DEFAULT** – 標準的 CommonMark 相容 Markdown。 +* **GIT** – Git 風格的 Markdown(支援表格、刪除線等)。 + +在大多數版本控制情境下,建議使用 **GIT** formatter。 + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### 只啟用必要的功能 + +你可以透過開啟特定的 feature flag 來微調輸出。以下範例僅保留 **links** 與 **paragraphs**,同時停用 images、tables 以及其他結構。 + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*為什麼這很重要:* 限制功能可減少產生檔案的大小,並避免下游工具無法支援的 Markdown 元素。 + +## 步驟 3:轉換文件 + +有了來源 `HTMLDocument` 與已設定好的 `MarkdownSaveOptions` 後,只需呼叫一次 `Converter.convert` 即可完成轉換。請提供輸出檔案的絕對或相對路徑。 + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +執行完畢後,`output.md` 即為原始 HTML 的 Markdown 表示。 + +## 完整腳本(即刻可執行) + +以下是結合前述所有步驟的完整、獨立腳本。將其儲存為 `html_to_md.py`,然後執行 `python html_to_md.py`。 + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### 預期輸出(`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +輸出保留了原始 HTML 的結構,同時只呈現我們啟用的功能(links、paragraphs 與 lists)。 + +## 處理常見邊緣情況 + +### 缺少或格式錯誤的 `href` 屬性 + +若 `` 標籤沒有有效的 `href`,轉換器會只插入連結文字而不附帶 URL。為了保持可讀性,你可能需要對 Markdown 進行後處理: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### 轉換大型 HTML 檔案 + +對於多 MB 的 HTML 檔案,建議以串流方式讀入,以免一次將整個標記載入記憶體: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +轉換流程本身不變,因為 `HTMLDocument` 已抽象化來源大小。 + +## 替代的 formatter + +如果你偏好純粹的 CommonMark 而非 Git 風格的輸出,只需切換 formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +這會產生更精簡的 Markdown 檔案,適合不支援 Git 擴充功能的平台。 + +## 相關任務建議 + +* **將 Markdown 轉回 HTML** – 方便預覽文件。 +* **將 HTML 匯出為 PDF** – 另一個常見的 **html to markdown conversion** 相關工作流程。 +* **批次處理資料夾內的 HTML 檔案** – 迭代檔案並重複使用相同的 `MarkdownSaveOptions` 實例。 + +以上皆遵循相同模式:建立來源文件、設定儲存選項,最後呼叫 `Converter.convert`。 + +## 結論 + +現在你已掌握如何在 Python 中 **將 HTML 轉換為 Markdown**、如何以精確的功能控制 **將 HTML 儲存為 Markdown**,以及為何選擇正確的 formatter 對下游工具至關重要。此範例展示了一個乾淨、可重用的做法,適用於單一字串、檔案或 URL,並提供了處理缺失連結與大型輸入的技巧。 + +歡迎自行嘗試其他 `MarkdownSaveOptions.Features`(例如 `IMAGE`、`TABLE`),依專案需求客製化輸出。若本指南對你有幫助,請與同事分享或在專案文件中加入連結。祝轉換順利! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/hongkong/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..ab47adaca2 --- /dev/null +++ b/html/hongkong/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,210 @@ +--- +category: general +date: 2026-10-02 +description: 學習如何在 Python 中建立 SVG 文件、將 SVG 儲存至檔案,並使用簡短完整的腳本匯出 SVG 圖像。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: zh-hant +lastmod: 2026-10-02 +og_description: 使用 Python 建立 SVG 文件,並透過本實用教學匯出 SVG 圖像。跟隨腳本,將 SVG 儲存至檔案,即可立即重用向量圖形。 +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: 在 Python 中建立 SVG 文件 – 逐步指南 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: 如何在 Python 中建立 SVG 文件並匯出為圖像 +url: /zh-hant/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中建立 SVG 文件並匯出為影像 + +如果你需要以程式方式 **create SVG document**,本教學將會示範如何使用 Python 完成。你將看到一個完整的腳本,建立一個簡單的圓形、將 SVG 儲存至檔案,並產生可在任何地方嵌入的可匯出 SVG 影像。 + +從程式碼產生可縮放向量圖形,可省去在 GUI 編輯器中手動繪製形狀的工作。於本指南結束時,你可以將 SVG 建立整合至資料視覺化管線、自動化報告產生器,或任何需要清晰、解析度獨立圖形的專案中。 + +## 前置條件 + +在開始之前,請確保你已具備: + +- 已安裝 Python 3.8 或更新版本 +- `svgwrite` 函式庫(使用 `pip install svgwrite` 安裝) +- 對 SVG 將被儲存的目錄具有寫入權限 + +這些需求確保範例輕量且相容於大多數環境。 + +## 步驟 1:安裝並匯入 SVG 函式庫 + +第一步是加入提供便利 API 用於 SVG 建立的第三方函式庫。 + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` 抽象化 SVG 檔案的 XML 結構,讓你專注於幾何形狀而非原始標記。 + +## 步驟 2:建立 SVG 文件物件 + +現在你可以透過實例化 `svgwrite.Drawing` 來 **create SVG document**。此物件代表根 `` 元素,並容納所有後續的形狀。 + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` 參數定義渲染的像素尺寸,而 `viewBox` 則建立與稍後定義的幾何相匹配的座標系統。 + +## 步驟 3:加入圓形元素 + +圓形由其中心 (`cx`, `cy`) 與半徑 (`r`) 定義。使用 `circle` 輔助函式來設定這些屬性。 + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +此圓形位於 100 × 100 畫布的中央,四側留有 10 像素的邊距。可調整 `fill` 與 `stroke` 以符合你的設計語言。 + +## 步驟 4:將 SVG 儲存至檔案 + +圖形組合完成後,你可以使用 `save` 方法 **save SVG to file**。此操作會寫入符合規範的 XML,讓瀏覽器與向量編輯器皆能辨識。 + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +`circle.svg` 檔案現在位於目前工作目錄。你可以在網頁瀏覽器、Inkscape 或任何支援 SVG 格式的工具中開啟它。 + +## 步驟 5:驗證匯出的 SVG 影像 + +在瀏覽器中開啟已儲存的檔案以確認輸出。你應該會看到一個置中的圓形,顏色如指定。原始 XML 如下: + +```xml + + + + +``` + +由於 SVG 為向量基礎,你可以在不失真的情況下縮放影像,這使其非常適合響應式網頁設計或高解析度列印。 + +## 小技巧:將 SVG 匯出為 PNG 或 JPEG + +如果需要點陣圖版本,可將 SVG 檔案與轉換工具(例如 **CairoSVG**)結合使用: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +此步驟示範 **export SVG image** 為點陣圖格式,當下游系統無法直接渲染 SVG 時相當有用。 + +## 常見變化與邊緣情況 + +| 變化 | 處理方式 | +|-----------|---------------| +| 多個形狀 | 對每個新元素(rect、line、path)呼叫 `dwg.add()`。 | +| 動態尺寸 | 在建立 `Drawing` 前,根據資料計算 `size` 與 `viewBox`。 | +| 文字標籤 | 使用 `dwg.text("Label", insert=("10", "20"))`,並以 `font_size` 與 `fill` 進行樣式設定。 | +| 重複使用文件 | 將 `Drawing` 物件保留於記憶體,並在需要更新檔案時呼叫 `save()`。 | +| 大型檔案 | 使用 `dwg.tostring()` 串流輸出,並手動寫入檔案物件,以避免記憶體激增。 | + +處理這些情境可確保你的 **how to generate SVG** 腳本能從簡單圖示擴展至複雜圖表。 + +## 完整腳本回顧 + +以下是完整且可執行的範例,結合所有步驟與可選的轉換: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +## 結論 + +你現在已了解如何在 Python 中 **create SVG document**、**save SVG to file**,以及 **export SVG image** 以供更廣泛的使用。此範例涵蓋了必要的 API 呼叫,說明每個步驟的重要性,並提供更複雜圖形的擴充方式。 + +接下來,可探索其他 **SVG Python tutorial** 主題,例如繪製路徑、套用漸層與動畫元素。整合這些技巧將讓你直接從 Python 應用程式產生動態、資料驅動的向量圖形。祝程式開發愉快! + +## 接下來該學什麼? + +以下教學涵蓋與本指南緊密相關的主題,建立於所示技巧之上。每個資源皆包含完整可運作的程式碼範例與逐步說明,協助你精通額外的 API 功能,並在自己的專案中探索替代實作方式。 + +- [在 Aspose.HTML for Java 中建立與管理 SVG 文件](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [在 Aspose.HTML for Java 中儲存 SVG 文件](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – 使用 Aspose.HTML for Java 將 SVG 轉換為影像](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/hongkong/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..163b0eeb2f --- /dev/null +++ b/html/hongkong/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: 學習如何在 Python 中使用 HtmlSaveOptions 及串流方式載入 HTML 文件,以高效處理大型 HTML 檔案。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: zh-hant +lastmod: 2026-10-02 +og_description: 在 Python 中使用 HtmlSaveOptions 與串流載入 HTML 文件。本教學提供完整、即時可執行的解決方案,適用於大型 + HTML 檔案。 +og_image_alt: Diagram showing load html document using streaming in Python +og_title: 在 Python 中以串流方式載入 HTML 文件 – 步驟指南 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: 如何在 Python 中使用串流載入 HTML 文件 +url: /zh-hant/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Python 中以串流方式載入 HTML 文件 + +如果您需要 **載入 html 文件**,且檔案大小達到數百 MB 甚至更大,記憶體使用量很快就會成為問題。本指南提供一個完整、可直接執行的解決方案,利用 **HTML 串流** 讓記憶體消耗保持在低水平,同時仍能完整存取文件內容。 + +您將學會如何設定 `HtmlSaveOptions`、啟用串流,並儲存處理後的檔案——整個流程僅需三個簡潔步驟。除了標準的 `aspose.html` Python 套件外,無需其他外部工具,非常適合批次作業、伺服器端管線或本機腳本處理 **大型 HTML 檔案**。 + +## 前置條件 + +開始之前,請確保您已具備: + +* 已安裝 Python 3.8 或更新版本。 +* `aspose.html` 套件(`pip install aspose-html`)——提供 `HTMLDocument` 與 `HtmlSaveOptions`。 +* 包含欲處理大型 HTML 檔案的目錄(例如 `large.html`)。 + +這些需求相當簡潔,讓您能專注於高效載入 HTML 文件的核心邏輯。 + +## 步驟 1:載入 HTML 文件 + +第一步是建立指向來源檔案的 `HTMLDocument` 實例。此物件代表 **load html document** 操作,會以延遲方式解析標記,這對處理大型檔案至關重要。 + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**為什麼這很重要:** +建立 `HTMLDocument` 物件不會立即將整個檔案讀入記憶體,而是準備一個串流解析器,根據需要從磁碟讀取資料。此設計讓您能處理超出機器 RAM 容量的檔案。 + +## 步驟 2:使用 HtmlSaveOptions 啟用串流 + +為了在操作或儲存文件時保持低記憶體佔用,必須在 `HtmlSaveOptions` 上啟用串流模式。這個次要關鍵字 **HtmlSaveOptions** 控制庫寫入輸出檔案的方式。 + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**為什麼要啟用串流?** +當 `enable_streaming` 設為 `True` 時,庫會分塊寫入輸出,而不是將整個結果緩存在記憶體中。這在您稍後 **save the document** 或對 **large HTML files** 進行轉換時尤為關鍵。 + +## 步驟 3:使用已設定的選項儲存文件 + +現在串流已啟用,您可以安全地將處理後的內容寫入新檔案。`save` 方法會遵循先前設定的 `HtmlSaveOptions`,確保操作保持記憶體效能。 + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**背後發生的事:** +`save` 呼叫會將 HTML 標記逐段串流至 `large_out.html`。由於文件是以串流解析器載入,從載入到儲存的整個管線皆以恆定、低記憶體使用執行。 + +## 完整範例 + +將上述三個步驟結合,即可得到一個可直接在命令列執行的精簡腳本: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**預期輸出** + +執行腳本 (`python load_html_document_streaming.py`) 後,您應該會看到: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` 檔案將是原始檔案的忠實複製,但整個處理過程從未將整個檔案載入 RAM。 + +## 常見問題與邊緣案例處理 + +### 這能處理包含外部資源(圖片、CSS、腳本)的 HTML 檔案嗎? + +可以。串流解析器會將外部參考視為普通屬性,除非您明確要求,否則不會下載這些資源。若需嵌入這些資源,可在文件載入後使用 `aspose.html` 的其他 API。 + +### 若來源檔案損毀或不是良好格式的 HTML,該怎麼辦? + +`HTMLDocument` 會嘗試從輕微錯誤中復原,但嚴重的格式錯誤會拋出例外。建議將載入步驟包在 `try/except` 中,以優雅處理此類情況: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### 我可以在儲存前修改 DOM 嗎? + +當然可以。載入後,您可完整存取 DOM 樹 (`html_doc.dom`);可以插入節點、移除元素或變更屬性,然後仍以串流方式呼叫 `save`。記憶體使用量仍會保持低位,因為變更是逐步套用的。 + +### 串流會影響輸出品質嗎? + +不會。只要您未對 DOM 做任何修改,串流輸出與非串流保存得到的位元組完全相同。串流僅改變資料寫入方式,而不改變寫入內容。 + +## 效能小技巧:測量記憶體使用量 + +若想驗證串流真的降低了記憶體消耗,可使用 `psutil` 套件: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +即使處理 500 MB 的 HTML 檔案,通常也只會看到幾 MB 的 RAM 使用量。 + +## 結論 + +本教學說明了如何在 Python 中高效 **load html document**: + +1. 建立 `HTMLDocument` 以延遲解析檔案。 +2. 使用 `HtmlSaveOptions` 並將 `enable_streaming = True` 設為低記憶體寫入。 +3. 以串流方式將文件儲存至磁碟。 + +這三個步驟提供了一個穩健的模式,讓您能使用 **Python HTML processing** 技術處理 **large HTML files**。之後您可以擴充腳本以修改 DOM、抽取資料,或批次處理多個檔案——同時保持可預測的記憶體使用。 + +**後續步驟** + +* 探索 `aspose.html` 的 DOM API,提取表格、連結或圖片。 +* 結合多執行緒,同時處理多個檔案。 +* 若需控制字元編碼或其他解析細節,可參考 `HtmlLoadOptions`。 + +祝編程愉快,盡情享受以記憶體友善方式 **load html document** 的效益! + +## 接下來您可以學習什麼? + +以下教學與本指南的技術緊密相關,提供完整的程式碼範例與逐步說明,協助您掌握更多 API 功能,並在專案中探索其他實作方式。 + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/hungarian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..8016f261d5 --- /dev/null +++ b/html/hungarian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,249 @@ +--- +category: general +date: 2026-10-02 +description: HTML konvertálása Markdown-re Pythonban egy teljes példával. Tanulja + meg, hogyan mentse a HTML-t Markdownként, válasszon formázókat, és engedélyezzen + specifikus funkciókat. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: hu +lastmod: 2026-10-02 +og_description: Konvertálja a HTML-t Markdown-re Pythonban praktikus kóddal, formázó + opciókkal és funkciókapcsolókkal. Kövesse ezt az útmutatót, hogy gyorsan mentse + a HTML-t Markdown formátumba. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: HTML átalakítása Markdown-re Pythonban – teljes útmutató +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Hogyan konvertáljunk HTML‑t Markdown‑re Pythonban – lépésről‑lépésre útmutató +url: /hu/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan konvertáljunk HTML-t Markdown-re Pythonban – lépésről‑lépésre útmutató + +Ha **HTML-t kell Markdown-re konvertálni**, ez az útmutató egy teljes, futtatható megoldást mutat be Pythonban. Megmutatja, hogyan **mentheted el a HTML-t Markdown-ként**, hogyan válaszd ki a megfelelő formázót, és hogyan engedélyezd csak azokat a funkciókat, amelyekre szükséged van. + +A HTML Markdown-re konvertálása gyakori feladat, ha könnyű dokumentációt, statikus weboldal tartalmat vagy verziókövetett szövegfájlokat szeretnél. Ez a tutorial mindent lefed a könyvtár telepítésétől a szélsőséges esetek kezeléséig, így a technikát bármilyen HTML forrásra alkalmazhatod. + +## Előfeltételek + +Mielőtt elkezdenéd, győződj meg róla, hogy a következőkkel rendelkezel: + +* Python 3.8 vagy újabb telepítve. +* `pip` hozzáférés a harmadik féltől származó csomagok telepítéséhez. +* Alapvető ismeretek a HTML címkékről és a Markdown szintaxisról. + +Nem szükséges további rendszerfüggőség, mivel a konverziós könyvtár tisztán Python. + +## Telepítsd a GroupDocs Conversion könyvtárat + +A kódminta a **GroupDocs.Conversion** Python csomagot használja, amely biztosítja a `HTMLDocument`, `MarkdownSaveOptions` és `Converter` osztályokat. Telepítsd a következővel: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tipp:** Használj virtuális környezetet (`python -m venv venv`), hogy a csomagot elkülönítsd a többi projekttől. + +## 1. lépés: `HTMLDocument` létrehozása egy karakterláncból + +Az első lépés, hogy a nyers HTML-t egy `HTMLDocument` példányba csomagold. Ez az objektum absztrahálja a forrást, legyen az karakterlánc, fájl vagy távoli URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Miért fontos:* A `HTMLDocument` egyszer elemzi a jelölőnyelvet, lehetővé téve, hogy a konverter normalizált reprezentációval dolgozzon a nyers szöveg helyett. + +## 2. lépés: `MarkdownSaveOptions` beállítása + +A `MarkdownSaveOptions` lehetővé teszi a kimeneti formátum és a kiadott Markdown funkciók szabályozását. A könyvtár két formázót támogat: + +* **DEFAULT** – szabványos, CommonMark‑kompatibilis Markdown. +* **GIT** – Git‑flavored Markdown (táblázatokat, áthúzást stb. ad hozzá). + +A legtöbb verziókezelési esetben a **GIT** formázó a preferált. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Csak a szükséges funkciók engedélyezése + +A kimenetet finomhangolhatod bizonyos funkciókapcsolók be- vagy kikapcsolásával. Ebben a példában a **linkek** és **bekezdések** maradnak engedélyezve, míg a képek, táblázatok és egyéb szerkezetek le vannak tiltva. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Miért fontos:* A funkciók korlátozása csökkenti a generált fájl méretét, és megakadályozza a váratlan Markdown elemeket, amelyeket a downstream eszközök esetleg nem támogatnak. + +## 3. lépés: A dokumentum konvertálása + +A forrás `HTMLDocument` és a beállított `MarkdownSaveOptions` segítségével a konvertálás egyetlen hívás a `Converter.convert`-ra. Adj meg abszolút vagy relatív útvonalat a kimeneti fájlhoz. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +A hívás befejezése után az `output.md` tartalmazza az eredeti HTML Markdown-reprezentációját. + +## Teljes szkript, amelyet ma futtathatsz + +Az alábbiakban a teljes, önálló szkript látható, amely tartalmazza az összes korábbi lépést. Mentsd el `html_to_md.py` néven, és futtasd a `python html_to_md.py` paranccsal. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Várt kimenet (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +A kimenet megegyezik az eredeti HTML struktúrájával, miközben csak a bekapcsolt funkciókat (linkek, bekezdések és listák) tartalmazza. + +## Gyakori szélsőséges esetek kezelése + +### Hiányzó vagy hibás `href` attribútumok + +Ha egy `` elemnek nincs érvényes `href` attribútuma, a konverter a link szövegét URL nélkül illeszti be. Az olvashatóság megőrzése érdekében érdemes lehet utófeldolgozni a Markdown-t: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Nagy HTML fájlok konvertálása + +Több megabájtos HTML fájlok esetén streameld a bemenetet, hogy elkerüld a teljes jelölőnyelv memóriába töltését: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +A konvertálási folyamat maga változatlan marad, mivel a `HTMLDocument` elrejti a forrás méretét. + +## Alternatív formázók + +Ha a Git‑flavored kimenet helyett a tiszta CommonMark-ot részesíted előnyben, válts a formázót: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Ez egy minimalista Markdown fájlt eredményez, ami hasznos, ha olyan platformokra célozol, amelyek nem támogatják a Git kiterjesztéseket. + +## Kapcsolódó feladatok, amelyeket érdemes felfedezni + +* **Convert Markdown back to HTML** – hasznos a dokumentáció előnézetéhez. +* **Export HTML to PDF** – egy másik gyakori **html to markdown conversion**‑szomszédos munkafolyamat. +* **Batch process a folder of HTML files** – fájlok ciklusba vétele és ugyanazon `MarkdownSaveOptions` példány újrahasználata. + +Mindegyik ugyanazt a mintát követi: forrásdokumentum létrehozása, mentési beállítások konfigurálása, és a `Converter.convert` meghívása. + +## Következtetés + +Most már tudod, hogyan **konvertálj HTML-t Markdown-re** Pythonban, hogyan **mentsd el a HTML-t Markdown-ként** pontos funkcióvezérléssel, és miért fontos a megfelelő formázó kiválasztása a downstream eszközök számára. A példa egy tiszta, újrahasználható megközelítést mutat be, amely egyetlen karakterláncra, fájlra vagy URL-re is működik, és tippeket tartalmaz a hiányzó linkek és nagy bemenetek kezelésére. + +Nyugodtan kísérletezz további `MarkdownSaveOptions.Features` (pl. `IMAGE`, `TABLE`) beállításokkal, hogy a kimenetet a projekted igényeihez igazítsd. Ha hasznosnak találtad ezt az útmutatót, oszd meg a csapattagokkal, vagy linkeld be a projekt dokumentációjába. Boldog konvertálást! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/hungarian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..50804c4f6b --- /dev/null +++ b/html/hungarian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Tanulja meg, hogyan hozhat létre SVG-dokumentumot Pythonban, hogyan mentheti + el az SVG-t fájlba, és hogyan exportálhat SVG-képet egy rövid, teljes szkripttel. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: hu +lastmod: 2026-10-02 +og_description: Készíts SVG dokumentumot Pythonban, és exportáld az SVG képet ezzel + a gyakorlati útmutatóval. Kövesd a szkriptet, mentsd el az SVG‑t fájlba, és azonnal + használd újra a vektorgrafikát. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: SVG dokumentum létrehozása Pythonban – lépésről lépésre útmutató +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Hogyan lehet SVG dokumentumot létrehozni és képként exportálni Pythonban +url: /hu/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan hozhatunk létre SVG dokumentumot, és exportálhatjuk képként Pythonban + +Ha programozott módon **create SVG document**-ot kell létrehoznod, ez a bemutató pontosan megmutatja, hogyan teheted ezt Pythonban. Egy teljes szkriptet láthatsz, amely egy egyszerű kört épít, elmenti az SVG-t fájlba, és egy exportálható SVG képet hoz létre, amelyet bárhol beágyazhatsz. + +A kódból történő skálázható vektorgrafika generálása megszünteti a kézi rajzolás szükségességét egy GUI szerkesztőben. A útmutató végére képes leszel az SVG létrehozását integrálni adat‑vizualizációs folyamatokba, automatizált jelentéskészítő rendszerekbe, vagy bármely olyan projektbe, amely éles, felbontás‑független grafikát igényel. + +## Prerequisites + +Mielőtt elkezdenéd, győződj meg róla, hogy a következők telepítve vannak: + +- Python 3.8 vagy újabb +- A `svgwrite` könyvtár (telepítés: `pip install svgwrite`) +- Írási jogosultság a könyvtárban, ahová az SVG-t menteni fogod + +Ezek a követelmények biztosítják, hogy a példa könnyű maradjon, és a legtöbb környezetben kompatibilis legyen. + +## Step 1: Install and import the SVG library + +Az első lépés a harmadik féltől származó könyvtár hozzáadása, amely kényelmes API‑t biztosít az SVG létrehozásához. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +A `svgwrite` elrejti az SVG fájl XML‑szerkezetét, így a geometriára koncentrálhatsz a nyers markup helyett. + +## Step 2: Create an SVG document object + +Most már **create SVG document**-ot hozhatsz létre a `svgwrite.Drawing` példányosításával. Ez az objektum képviseli a gyökér `` elemet, és tartalmazza az összes későbbi alakzatot. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +A `size` argumentum határozza meg a megjelenített pixelméreteket, míg a `viewBox` egy koordináta‑rendszert állít fel, amely megfelel a később definiált geometriának. + +## Step 3: Add a circle element + +A kör középpontját (`cx`, `cy`) és a sugarát (`r`) határozza meg. Használd a `circle` segédfüggvényt ezeknek az attribútumoknak a beállításához. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +A kör a 100 × 100‑as vászon közepén helyezkedik el, mindkét oldalon 10‑pixel margóval. Állítsd be a `fill` és `stroke` értékeket a tervezési nyelvednek megfelelően. + +## Step 4: Save the SVG to file + +Miután a grafika összeállt, **save SVG to file**-t használhatsz a `save` metódussal. Ez jól formált XML‑t ír, amelyet a böngészők és vektorszerkesztők is értenek. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +A `circle.svg` fájl most a jelenlegi munkakönyvtárban található. Megnyithatod egy webböngészőben, az Inkscape‑ben vagy bármely SVG‑t támogató eszközben. + +## Step 5: Verify the exported SVG image + +Nyisd meg a mentett fájlt egy böngészőben, hogy ellenőrizd a kimenetet. Középen egy körnek kell látszania a megadott színekkel. A nyers XML így néz ki: + +```xml + + + + +``` + +Mivel az SVG vektor‑alapú, a képet minőségromlás nélkül skálázhatod, ami ideálissá teszi reszponzív webdesignokhoz vagy nagy felbontású nyomtatáshoz. + +## Pro tip: Export SVG as PNG or JPEG + +Ha raszteres változatra van szükséged, kombináld az SVG fájlt egy konverziós eszközzel, például a **CairoSVG**‑vel: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Ez a lépés bemutatja a **export SVG image**-t bitmap formátumba, ami hasznos, ha a downstream rendszerek nem képesek közvetlenül SVG‑t renderelni. + +## Common variations and edge cases + +| Variation | How to handle | +|-----------|---------------| +| Multiple shapes | Hívj `dwg.add()`‑t minden új elemhez (rect, line, path). | +| Dynamic dimensions | Számold ki a `size` és `viewBox` értékeket adatból, mielőtt a `Drawing`‑t létrehoznád. | +| Text labels | Használd `dwg.text("Label", insert=("10", "20"))`‑t, és stílusozd `font_size`‑szel és `fill`‑el. | +| Re‑using the document | Tartsd a `Drawing` objektumot memóriában, és hívd a `save()`‑t, amikor friss fájlra van szükség. | +| Large files | Streameld a kimenetet a `dwg.tostring()`‑val, és írd egy fájlobjektumba manuálisan, hogy elkerüld a memória‑spike‑eket. | + +Ezeknek a forgatókönyveknek a kezelése biztosítja, hogy a **how to generate SVG** szkripted a egyszerű ikonoktól a komplex diagramokig skálázható legyen. + +## Full script recap + +Az alábbiakban a teljes, futtatható példát láthatod, amely tartalmazza az összes lépést és az opcionális konverziót: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +A szkript futtatása `circle.svg`‑t és, ha a `cairosvg` telepítve van, `circle.png`‑t hoz létre. Mindkét fájl készen áll a weboldalakba, jelentésekbe vagy további feldolgozásba való beillesztésre. + +## Conclusion + +Most már tudod, hogyan **create SVG document**-ot készíts Pythonban, hogyan **save SVG to file**, és hogyan **export SVG image**-et használhatsz szélesebb körben. A példa lefedi a legfontosabb API‑hívásokat, elmagyarázza, miért fontos minden egyes lépés, és kiterjesztéseket kínál összetettebb grafikákhoz. + +Ezután fedezd fel a további **SVG Python tutorial** témákat, például útvonalak rajzolását, gradientek alkalmazását és elemek animálását. Ezeknek a technikáknak az integrálásával dinamikus, adat‑vezérelt vektorgrafikákat generálhatsz közvetlenül Python‑alkalmazásaidból. Boldog kódolást! + +## What Should You Learn Next? + +Az alábbi oktatóanyagok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás teljes, működő kódrészleteket tartalmaz lépésről‑lépésre magyarázatokkal, hogy segítsenek az API további funkcióinak elsajátításában és alternatív megvalósítási megközelítések felfedezésében a saját projektjeidben. + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/hungarian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..86b07c4911 --- /dev/null +++ b/html/hungarian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Tanulja meg, hogyan töltsön be HTML-dokumentumot Pythonban a HtmlSaveOptions + és a streaming használatával, hogy nagy HTML-fájlokat hatékonyan dolgozzon fel. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: hu +lastmod: 2026-10-02 +og_description: HTML dokumentum betöltése Pythonban a HtmlSaveOptions és a streaming + használatával. Ez az útmutató egy teljes, azonnal futtatható megoldást mutat be + nagy HTML fájlokhoz. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: HTML dokumentum betöltése streaminggel Pythonban – lépésről lépésre útmutató +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: HTML dokumentum betöltése streaminggel Pythonban +url: /hu/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to load html document with streaming in Python + +Ha **load html document** fájlokat kell betölteni, amelyek több száz megabájtosak vagy nagyobbak, gyorsan memóriahasználati problémákkal fogsz szembesülni. Ez az útmutató egy teljes, azonnal futtatható megoldást mutat be, amely **HTML streaming**-et használ a memóriafogyasztás alacsonyan tartásához, miközben teljes hozzáférést biztosít a dokumentum tartalmához. + +Megtanulod, hogyan konfiguráld a `HtmlSaveOptions`-t, engedélyezd a streaminget, és mentsd el a feldolgozott fájlt – mindezt csak három tömör lépésben. Külső eszközök nem szükségesek a standard `aspose.html` Python csomagon kívül, ami ideálissá teszi a megközelítést kötegelt feladatokhoz, szerveroldali csővezetékekhez vagy helyi szkriptekhez, amelyek **large HTML files**-t kezelnek. + +## Előfeltételek + +* Python 3.8 vagy újabb telepítve. +* Az `aspose.html` könyvtár (`pip install aspose-html`) – ez biztosítja a `HTMLDocument` és `HtmlSaveOptions` osztályokat. +* Egy könyvtár, amely tartalmazza a nagy HTML fájlt, amellyel dolgozni szeretnél (például `large.html`). + +Ezek a követelmények minimálisak, így a HTML dokumentum betöltésének alaplogikájára koncentrálhatsz. + +## 1. lépés: Load html document + +Az első művelet egy `HTMLDocument` példány létrehozása, amely a forrásfájlra mutat. Ez az objektum a **load html document** műveletet képviseli, és lusta módon elemzi a jelölőnyelvet, ami elengedhetetlen a nagy fájlok kezeléséhez. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Miért fontos ez:** +A `HTMLDocument` objektum létrehozása nem olvassa be azonnal a teljes fájlt a memóriába. Ehelyett egy streaming elemzőt készít elő, amely a szükség szerint húzza be az adatokat a lemezről. Ez a tervezés lehetővé teszi, hogy olyan fájlokkal dolgozz, amelyek meghaladják a géped RAM-ját. + +## 2. lépés: Streaming engedélyezése HtmlSaveOptions-szal + +A memóriahasználat alacsonyan tartásához, miközben a dokumentumot manipulálod vagy mented, engedélyezned kell a streaming módot a `HtmlSaveOptions`-on. Ez a másodlagos kulcsszó, **HtmlSaveOptions**, szabályozza, hogyan írja a könyvtár a kimeneti fájlt. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Miért engedélyezzük a streaminget?** +Amikor az `enable_streaming` `True`-ra van állítva, a könyvtár a kimenetet darabokban írja, ahelyett, hogy a teljes eredményt a memóriában tárolná. Ez kulcsfontosságú, amikor később **save the document**-et hajtasz végre, vagy átalakításokat végzel **large HTML files**-on. + +## 3. lépés: Dokumentum mentése a konfigurált beállításokkal + +Most, hogy a streaming aktív, biztonságosan írhatod a feldolgozott tartalmat egy új fájlba. A `save` metódus figyelembe veszi a konfigurált `HtmlSaveOptions`-t, biztosítva, hogy a művelet memóriahatékony maradjon. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Mi történik a háttérben:** +A `save` hívás darabonként streameli a HTML jelölőnyelvet a `large_out.html` fájlba. Mivel a dokumentumot streaming elemzővel töltöttük be, az egész csővezeték – a betöltéstől a mentésig – állandó, alacsony memóriahasználattal működik. + +## Teljes működő példa + +A három lépés egyesítése egy kompakt szkriptet eredményez, amelyet közvetlenül a parancssorból futtathatsz: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Várható kimenet** + +Amikor futtatod a szkriptet (`python load_html_document_streaming.py`), a következőt kell látnod: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +A `large_out.html` fájl hű másolata lesz az eredetinek, de anélkül lett feldolgozva, hogy valaha betöltötte volna a teljes fájlt a RAM-ba. + +## Gyakori kérdések és szél‑eset kezelése + +### Működik ez HTML fájlokkal, amelyek külső erőforrásokat (képek, CSS, szkriptek) tartalmaznak? + +Igen. A streaming elemző a külső hivatkozásokat szokásos attribútumokként kezeli. **Nem** tölti le az erőforrásokat, hacsak kifejezetten nem kérsz letöltést. Ha be kell ágyaznod ezeket az erőforrásokat, a dokumentum betöltése után további API-kat használhatsz az `aspose.html`-ból. + +### Mi van, ha a forrásfájl sérült vagy nem jól formázott HTML? + +`HTMLDocument` megpróbál helyrehozni kisebb hibákat, de súlyos hibák kivételt váltanak ki. A betöltési lépést `try/except` blokkba kell helyezni, hogy ezeket az eseteket elegánsan kezeld: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Módosíthatom a DOM-ot mentés előtt? + +Természetesen. Betöltés után teljes hozzáférésed van a DOM fához (`html_doc.dom`). Beszúrhatsz csomópontokat, eltávolíthatsz elemeket, vagy módosíthatod az attribútumokat, majd meghívhatod a `save`-et, miközben a streaming továbbra is engedélyezett. A memóriahasználat alacsony marad, mivel a változtatások fokozatosan kerülnek alkalmazásra. + +### Befolyásolja a streaming a kimenet minőségét? + +Nem. A streamelt kimenet bájtonként azonos azzal, amit egy nem‑streaming mentésből kapnál, feltéve, hogy nem végeztél DOM módosításokat. A streaming csak azt változtatja meg, hogyan íródik a adat, nem pedig azt, hogy mi íródik. + +## Teljesítmény tipp: memóriahasználat mérése + +Ha szeretnéd ellenőrizni, hogy a streaming valóban csökkenti a memóriafogyasztást, használhatod a `psutil` könyvtárat: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Általában csak néhány megabájt RAM-ot fogsz látni, még 500 MB-os HTML fájlok esetén is. + +## Következtetés + +Ebben az útmutatóban megtanultad, hogyan **load html document**-ot tölts be hatékonyan Pythonban a következőkkel: + +1. `HTMLDocument` példányosítása a fájl lusta elemzéséhez. +2. `HtmlSaveOptions` konfigurálása `enable_streaming = True`-val az alacsony memóriahasználatú írásokhoz. +3. A dokumentum mentése, miközben a kimenetet streameljük a lemezre. + +Ezek a három lépés egy robusztus mintát ad a **large HTML files** feldolgozásához **Python HTML processing** technikákkal. Innen tovább bővítheted a szkriptet a DOM módosítására, adatok kinyerésére vagy tucatnyi fájl kötegelt feldolgozására – mindezt úgy, hogy a memóriahasználat kiszámítható marad. + +**Következő lépések** + +* Fedezd fel az `aspose.html` DOM API-t táblázatok, hivatkozások vagy képek kinyeréséhez. +* Kombináld ezt a megközelítést több szálas feldolgozással, hogy több fájlt párhuzamosan dolgozz fel. +* Tekintsd meg a `HtmlLoadOptions`-t, ha karakterkódolást vagy egyéb elemzési finomságokat kell szabályoznod. + +Boldog kódolást, és élvezd a memória‑barát módot a **load html document** méretes feldolgozásához! + +## Mit érdemes következőként megtanulni? + +A következő útmutatók szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás teljes működő kódpéldákat tartalmaz lépésről‑lépésre magyarázatokkal, hogy segítsenek elsajátítani további API funkciókat és alternatív megvalósítási megközelítéseket a saját projektjeidben. + +- [HTML dokumentum betöltése Java – Teljes útmutató XPath és CSS használatával](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [HTML betöltése URL segítségével .NET-ben az Aspose.HTML használatával](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Hogyan engedélyezzük a JavaScript-et az Aspose HTML-ben – HTML betöltése és szöveg lekérése](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/indonesian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..4a73dc1d3c --- /dev/null +++ b/html/indonesian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: Konversi HTML ke Markdown dalam Python dengan contoh lengkap. Pelajari + cara menyimpan HTML sebagai Markdown, memilih formatter, dan mengaktifkan fitur + tertentu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: id +lastmod: 2026-10-02 +og_description: Konversi HTML ke Markdown dalam Python dengan kode praktis, opsi pemformat, + dan flag fitur. Ikuti panduan ini untuk menyimpan HTML sebagai Markdown dengan cepat. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Konversi HTML ke Markdown di Python – tutorial lengkap +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Cara mengonversi HTML ke Markdown dalam Python – panduan langkah demi langkah +url: /id/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara mengonversi HTML ke Markdown di Python – panduan langkah‑demi‑langkah + +Jika Anda perlu **mengonversi HTML ke Markdown**, panduan ini menunjukkan solusi lengkap yang dapat dijalankan di Python. Anda akan melihat cara **menyimpan HTML sebagai Markdown**, memilih formatter yang tepat, dan mengaktifkan hanya fitur‑fitur yang Anda butuhkan. + +Mengonversi HTML ke Markdown adalah tugas umum ketika Anda menginginkan dokumentasi ringan, konten situs statis, atau file teks yang dikontrol versi. Tutorial ini mencakup semuanya mulai dari pemasangan pustaka hingga penanganan kasus tepi, sehingga Anda dapat menerapkan teknik ini pada sumber HTML apa pun. + +## Prasyarat + +Sebelum memulai, pastikan Anda memiliki: + +* Python 3.8 atau yang lebih baru terpasang. +* Akses `pip` untuk menginstal paket pihak ketiga. +* Familiaritas dasar dengan tag HTML dan sintaks Markdown. + +Tidak ada ketergantungan sistem tambahan yang diperlukan karena pustaka konversi ini murni Python. + +## Instal pustaka GroupDocs Conversion + +Contoh kode menggunakan paket Python **GroupDocs.Conversion**, yang menyediakan `HTMLDocument`, `MarkdownSaveOptions`, dan `Converter`. Instal dengan: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** Gunakan lingkungan virtual (`python -m venv venv`) untuk menjaga paket tetap terisolasi dari proyek lain. + +## Langkah 1: Buat `HTMLDocument` dari string + +Langkah pertama adalah membungkus HTML mentah Anda dalam instance `HTMLDocument`. Objek ini mengabstraksi sumber, apakah berasal dari string, file, atau URL remote. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Mengapa ini penting:* `HTMLDocument` mem-parsing markup satu kali, memungkinkan konverter bekerja dengan representasi yang ternormalisasi alih‑alih teks mentah. + +## Langkah 2: Konfigurasikan `MarkdownSaveOptions` + +`MarkdownSaveOptions` memungkinkan Anda mengontrol format output dan fitur Markdown mana yang dihasilkan. Pustaka ini mendukung dua formatter: + +* **DEFAULT** – Markdown standar yang kompatibel dengan CommonMark. +* **GIT** – Git‑flavored Markdown (menambahkan tabel, strikethrough, dll.). + +Untuk kebanyakan skenario kontrol versi, formatter **GIT** lebih disukai. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Mengaktifkan hanya fitur yang dibutuhkan + +Anda dapat menyetel output dengan mengaktifkan flag fitur tertentu. Pada contoh ini kami mempertahankan **tautan** dan **paragraf** sementara menonaktifkan gambar, tabel, dan konstruksi lainnya. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Mengapa ini penting:* Membatasi fitur mengurangi ukuran file yang dihasilkan dan mencegah elemen Markdown tak terduga yang mungkin tidak didukung oleh alat hilir. + +## Langkah 3: Konversi dokumen + +Dengan `HTMLDocument` sumber dan `MarkdownSaveOptions` yang telah dikonfigurasi, konversi cukup satu panggilan ke `Converter.convert`. Berikan path absolut atau relatif untuk file output. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Setelah pemanggilan selesai, `output.md` berisi representasi Markdown dari HTML asli. + +## Skrip lengkap yang dapat Anda jalankan hari ini + +Berikut adalah skrip lengkap yang berdiri sendiri dan menggabungkan semua langkah sebelumnya. Simpan sebagai `html_to_md.py` dan jalankan `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Output yang diharapkan (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Output mencerminkan struktur HTML asli sambil hanya menampilkan fitur yang kami aktifkan (tautan, paragraf, dan daftar). + +## Menangani kasus tepi yang umum + +### Atribut `href` yang hilang atau tidak valid + +Jika tag `` tidak memiliki `href` yang valid, konverter akan menyisipkan teks tautan tanpa URL. Untuk menjaga keterbacaan, Anda mungkin ingin memproses Markdown setelahnya: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Mengonversi file HTML besar + +Untuk file HTML berukuran multi‑megabyte, alirkan input untuk menghindari memuat seluruh markup ke memori: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Proses konversi sendiri tetap tidak berubah karena `HTMLDocument` mengabstraksi ukuran sumber. + +## Formatter alternatif + +Jika Anda lebih menyukai CommonMark biasa daripada output Git‑flavored, ubah formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Ini menghasilkan file Markdown yang lebih minimal, berguna ketika Anda menargetkan platform yang tidak mendukung ekstensi Git. + +## Tugas terkait yang dapat Anda jelajahi selanjutnya + +* **Mengonversi Markdown kembali ke HTML** – berguna untuk pratinjau dokumentasi. +* **Ekspor HTML ke PDF** – alur kerja **html to markdown conversion**‑adjacent yang umum. +* **Proses batch folder berisi file HTML** – iterasi file dan gunakan kembali instance `MarkdownSaveOptions` yang sama. + +Semua ini mengikuti pola yang sama: buat dokumen sumber, konfigurasikan opsi penyimpanan, dan panggil `Converter.convert`. + +## Kesimpulan + +Anda kini tahu cara **mengonversi HTML ke Markdown** di Python, cara **menyimpan HTML sebagai Markdown** dengan kontrol fitur yang tepat, serta mengapa memilih formatter yang tepat penting bagi alat hilir. Contoh ini menunjukkan pendekatan bersih dan dapat digunakan kembali yang bekerja untuk string tunggal, file, atau URL, serta menyertakan tips untuk menangani tautan yang hilang dan input besar. + +Silakan bereksperimen dengan `MarkdownSaveOptions.Features` tambahan (mis., `IMAGE`, `TABLE`) untuk menyesuaikan output dengan kebutuhan proyek Anda. Jika panduan ini membantu, bagikan kepada rekan tim atau tautkan dalam dokumentasi proyek Anda. Selamat mengonversi! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/indonesian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..cedd73e1c4 --- /dev/null +++ b/html/indonesian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-10-02 +description: Pelajari cara membuat dokumen SVG di Python, menyimpan SVG ke file, dan + mengekspor gambar SVG dengan skrip singkat yang lengkap. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: id +lastmod: 2026-10-02 +og_description: Buat dokumen SVG di Python dan ekspor gambar SVG dengan tutorial praktis + ini. Ikuti skripnya, simpan SVG ke file, dan gunakan kembali grafik vektor secara + instan. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Buat dokumen SVG di Python – panduan langkah demi langkah +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Cara membuat dokumen SVG dan mengekspornya sebagai gambar di Python +url: /id/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara membuat dokumen SVG dan mengekspornya sebagai gambar di Python + +Jika Anda perlu **membuat dokumen SVG** secara programatis, tutorial ini menunjukkan secara tepat cara melakukannya dengan Python. Anda akan melihat skrip lengkap yang membangun sebuah lingkaran sederhana, menyimpan SVG ke file, dan menghasilkan gambar SVG yang dapat diekspor dan disisipkan di mana saja. + +Membuat grafik vektor skalabel dari kode menghilangkan upaya manual menggambar bentuk di editor GUI. Pada akhir panduan ini Anda dapat mengintegrasikan pembuatan SVG ke dalam pipeline visualisasi data, generator laporan otomatis, atau proyek apa pun yang memerlukan grafik tajam dan independen resolusi. + +## Prasyarat + +Sebelum memulai, pastikan Anda memiliki: + +- Python 3.8 atau lebih baru terpasang +- Library `svgwrite` (pasang dengan `pip install svgwrite`) +- Izin menulis ke direktori tempat SVG akan disimpan + +Persyaratan ini menjaga contoh tetap ringan dan kompatibel dengan sebagian besar lingkungan. + +## Langkah 1: Instal dan impor library SVG + +Langkah pertama adalah menambahkan library pihak ketiga yang menyediakan API nyaman untuk pembuatan SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` mengabstraksi struktur XML dari file SVG, memungkinkan Anda fokus pada geometri alih-alih markup mentah. + +## Langkah 2: Buat objek dokumen SVG + +Sekarang Anda dapat **membuat dokumen SVG** dengan menginstansiasi `svgwrite.Drawing`. Objek ini mewakili elemen root `` dan menampung semua bentuk selanjutnya. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Argumen `size` menentukan dimensi piksel yang dirender, sementara `viewBox` menetapkan sistem koordinat yang cocok dengan geometri yang akan Anda definisikan nanti. + +## Langkah 3: Tambahkan elemen lingkaran + +Sebuah lingkaran didefinisikan oleh pusatnya (`cx`, `cy`) dan jari‑jari (`r`). Gunakan helper `circle` untuk melampirkan atribut‑atribut ini. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Lingkaran berada di tengah kanvas 100 × 100, meninggalkan margin 10 piksel di setiap sisi. Sesuaikan `fill` dan `stroke` agar sesuai dengan bahasa desain Anda. + +## Langkah 4: Simpan SVG ke file + +Setelah grafik selesai dirakit, Anda dapat **menyimpan SVG ke file** menggunakan metode `save`. Ini menulis XML yang terstruktur dengan baik yang dapat dipahami oleh peramban dan editor vektor. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +File `circle.svg` kini berada di direktori kerja saat ini. Anda dapat membukanya di peramban web, Inkscape, atau alat apa pun yang mendukung format SVG. + +## Langkah 5: Verifikasi gambar SVG yang diekspor + +Buka file yang disimpan di peramban untuk memastikan outputnya. Anda seharusnya melihat lingkaran terpusat dengan warna yang telah ditentukan. XML mentahnya terlihat seperti ini: + +```xml + + + + +``` + +Karena SVG berbasis vektor, Anda dapat memperbesar gambar tanpa kehilangan kualitas, menjadikannya ideal untuk desain web responsif atau cetakan resolusi tinggi. + +## Tips pro: Ekspor SVG sebagai PNG atau JPEG + +Jika Anda memerlukan versi raster, gabungkan file SVG dengan alat konversi seperti **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Langkah ini memperlihatkan **mengekspor gambar SVG** ke format bitmap, berguna ketika sistem hilir tidak dapat merender SVG secara langsung. + +## Variasi umum dan kasus tepi + +| Variasi | Cara menangani | +|-----------|---------------| +| Banyak bentuk | Panggil `dwg.add()` untuk setiap elemen baru (rect, line, path). | +| Dimensi dinamis | Hitung `size` dan `viewBox` dari data sebelum membuat `Drawing`. | +| Label teks | Gunakan `dwg.text("Label", insert=("10", "20"))` dan stilkan dengan `font_size` serta `fill`. | +| Menggunakan kembali dokumen | Simpan objek `Drawing` di memori dan panggil `save()` kapanpun Anda membutuhkan file yang diperbarui. | +| File besar | Alirkan output menggunakan `dwg.tostring()` dan tulis ke objek file secara manual untuk menghindari lonjakan memori. | + +Menangani skenario‑skenario ini memastikan skrip **cara menghasilkan SVG** Anda dapat diskalakan dari ikon sederhana hingga diagram kompleks. + +## Rekap skrip lengkap + +Berikut contoh lengkap yang dapat dijalankan dan mencakup semua langkah serta konversi opsional: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Menjalankan skrip ini menghasilkan `circle.svg` dan, jika `cairosvg` terpasang, `circle.png`. Kedua file siap disertakan dalam halaman web, laporan, atau proses lanjutan lainnya. + +## Kesimpulan + +Anda kini tahu cara **membuat dokumen SVG** di Python, **menyimpan SVG ke file**, dan **mengekspor gambar SVG** untuk penggunaan yang lebih luas. Contoh ini mencakup panggilan API penting, menjelaskan mengapa setiap langkah penting, serta menawarkan ekstensi untuk grafik yang lebih kompleks. + +Selanjutnya, jelajahi topik **tutorial SVG Python** tambahan seperti menggambar path, menerapkan gradien, dan menganimasikan elemen. Mengintegrasikan teknik‑teknik ini akan memungkinkan Anda menghasilkan grafik vektor dinamis yang didorong data langsung dari aplikasi Python Anda. Selamat coding! + + +## Apa yang Harus Anda Pelajari Selanjutnya? + + +Tutorial berikut mencakup topik terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber daya menyertakan contoh kode lengkap yang dapat dijalankan dengan penjelasan langkah demi langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Buat dan Kelola Dokumen SVG di Aspose.HTML untuk Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Simpan Dokumen SVG di Aspose.HTML untuk Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Konversi SVG ke Gambar dengan Aspose.HTML untuk Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/indonesian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..f755be6ee5 --- /dev/null +++ b/html/indonesian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,238 @@ +--- +category: general +date: 2026-10-02 +description: Pelajari cara memuat dokumen HTML di Python dengan HtmlSaveOptions dan + streaming untuk memproses file HTML besar secara efisien. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: id +lastmod: 2026-10-02 +og_description: Muat dokumen HTML di Python menggunakan HtmlSaveOptions dan streaming. + Tutorial ini menunjukkan solusi lengkap yang siap dijalankan untuk file HTML besar. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Muat dokumen HTML dengan streaming di Python – panduan langkah demi langkah +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Cara memuat dokumen HTML dengan streaming di Python +url: /id/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara memuat dokumen html dengan streaming di Python + +Jika Anda perlu **memuat dokumen html** yang berukuran ratusan megabyte atau lebih, Anda akan segera menghadapi masalah penggunaan memori. Panduan ini menunjukkan solusi lengkap yang siap dijalankan menggunakan **HTML streaming** untuk menjaga konsumsi memori tetap rendah sekaligus memberi Anda akses penuh ke isi dokumen. + +Anda akan belajar cara mengonfigurasi `HtmlSaveOptions`, mengaktifkan streaming, dan menyimpan file yang telah diproses—semua dalam tiga langkah singkat. Tidak ada alat eksternal yang diperlukan selain paket Python standar `aspose.html`, menjadikan pendekatan ini ideal untuk pekerjaan batch, pipeline sisi‑server, atau skrip lokal yang menangani **file HTML besar**. + +## Prasyarat + +Sebelum memulai, pastikan Anda memiliki: + +* Python 3.8 atau yang lebih baru terpasang. +* Perpustakaan `aspose.html` (`pip install aspose-html`) – menyediakan `HTMLDocument` dan `HtmlSaveOptions`. +* Direktori yang berisi file HTML besar yang ingin Anda kerjakan (misalnya, `large.html`). + +Persyaratan ini minimal, sehingga Anda dapat fokus pada logika inti memuat dokumen HTML secara efisien. + +## Langkah 1: Memuat dokumen HTML + +Operasi pertama adalah membuat instance `HTMLDocument` yang menunjuk ke file sumber. Objek ini mewakili operasi **load html document** dan mem-parsing markup secara malas, yang penting untuk menangani file besar. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Mengapa ini penting:** +Membuat objek `HTMLDocument` tidak langsung membaca seluruh file ke memori. Sebaliknya, ia menyiapkan parser streaming yang akan mengambil data dari disk sesuai kebutuhan. Desain ini memungkinkan Anda bekerja dengan file yang melebihi RAM mesin Anda. + +## Langkah 2: Mengaktifkan streaming dengan HtmlSaveOptions + +Agar jejak memori tetap rendah saat Anda memanipulasi atau menyimpan dokumen, Anda harus mengaktifkan mode streaming pada `HtmlSaveOptions`. Kata kunci sekunder ini, **HtmlSaveOptions**, mengontrol cara perpustakaan menulis file output. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Mengapa mengaktifkan streaming?** +Ketika `enable_streaming` diatur ke `True`, perpustakaan menulis output dalam potongan‑potongan alih‑alih menampung seluruh hasil di memori. Ini sangat penting ketika Anda kemudian **menyimpan dokumen** atau melakukan transformasi pada **file HTML besar**. + +## Langkah 3: Menyimpan dokumen dengan opsi yang telah dikonfigurasi + +Setelah streaming aktif, Anda dapat menulis konten yang telah diproses ke file baru dengan aman. Metode `save` menghormati `HtmlSaveOptions` yang telah kami atur, memastikan operasi tetap efisien memori. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Apa yang terjadi di balik layar:** +Pemanggilan `save` melakukan streaming markup HTML ke `large_out.html` potongan demi potongan. Karena dokumen dimuat dengan parser streaming, seluruh pipeline—dari load hingga save—beroperasi dengan penggunaan memori yang konstan dan rendah. + +## Contoh lengkap yang dapat dijalankan + +Menggabungkan ketiga langkah menghasilkan skrip ringkas yang dapat Anda jalankan langsung dari command line: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Output yang diharapkan** + +Saat Anda menjalankan skrip (`python load_html_document_streaming.py`), Anda akan melihat: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +File `large_out.html` akan menjadi salinan setia dari file asli, tetapi diproses tanpa pernah memuat seluruh file ke RAM. + +## Pertanyaan umum dan penanganan kasus tepi + +### Apakah ini bekerja dengan file HTML yang berisi sumber daya eksternal (gambar, CSS, skrip)? + +Ya. Parser streaming memperlakukan referensi eksternal sebagai atribut biasa. Ia **tidak** mengunduh sumber daya tersebut kecuali Anda secara eksplisit memintanya. Jika Anda perlu menyematkan sumber daya tersebut, Anda dapat menggunakan API tambahan dari `aspose.html` setelah dokumen dimuat. + +### Bagaimana jika file sumber rusak atau tidak berupa HTML yang baik? + +`HTMLDocument` akan berusaha memperbaiki kesalahan kecil, tetapi malformasi yang parah akan memicu pengecualian. Bungkus langkah load dalam blok `try/except` untuk menangani kasus tersebut secara elegan: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Bisakah saya memodifikasi DOM sebelum menyimpan? + +Tentu saja. Setelah dimuat, Anda memiliki akses penuh ke pohon DOM (`html_doc.dom`). Anda dapat menyisipkan node, menghapus elemen, atau mengubah atribut, lalu memanggil `save` dengan streaming tetap aktif. Penggunaan memori akan tetap rendah karena perubahan diterapkan secara inkremental. + +### Apakah streaming memengaruhi kualitas output? + +Tidak. Output yang di‑streamkan identik byte‑per‑byte dengan yang Anda dapatkan dari penyimpanan non‑streaming, asalkan Anda tidak melakukan modifikasi DOM. Streaming hanya mengubah cara data ditulis, bukan apa yang ditulis. + +## Tips kinerja: mengukur penggunaan memori + +Jika Anda ingin memverifikasi bahwa streaming memang mengurangi konsumsi memori, Anda dapat menggunakan perpustakaan `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Biasanya Anda hanya akan melihat beberapa megabyte RAM yang terpakai, bahkan untuk file HTML berukuran 500 MB. + +## Kesimpulan + +Dalam tutorial ini Anda belajar cara **memuat dokumen html** secara efisien di Python dengan: + +1. Membuat instance `HTMLDocument` untuk mem‑parse file secara malas. +2. Mengonfigurasi `HtmlSaveOptions` dengan `enable_streaming = True` untuk penulisan rendah‑memori. +3. Menyimpan dokumen sambil melakukan streaming output ke disk. + +Ketiga langkah ini memberikan pola yang kuat untuk memproses **file HTML besar** menggunakan teknik **pemrosesan HTML Python**. Dari sini Anda dapat memperluas skrip untuk memodifikasi DOM, mengekstrak data, atau memproses puluhan file secara batch—semua sambil menjaga penggunaan memori tetap dapat diprediksi. + +**Langkah selanjutnya** + +* Jelajahi API DOM `aspose.html` untuk mengekstrak tabel, tautan, atau gambar. +* Gabungkan pendekatan ini dengan multithreading untuk memproses banyak file secara paralel. +* Lihat `HtmlLoadOptions` jika Anda perlu mengontrol pengkodean karakter atau nuansa parsing lainnya. + +Selamat coding, dan nikmati cara **memuat dokumen html** yang ramah memori pada skala besar! + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber menyertakan contoh kode lengkap dengan penjelasan langkah‑demi‑langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/italian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..57e29f0372 --- /dev/null +++ b/html/italian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-10-02 +description: converti HTML in Markdown in Python con un esempio completo. Scopri come + salvare HTML come Markdown, scegliere i formattatori e abilitare funzionalità specifiche. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: it +lastmod: 2026-10-02 +og_description: converti HTML in Markdown in Python con codice pratico, opzioni di + formattazione e flag di funzionalità. Segui questa guida per salvare rapidamente + l'HTML come Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Converti HTML in Markdown con Python – tutorial completo +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Come convertire HTML in Markdown con Python – guida passo passo +url: /it/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come convertire HTML in Markdown in Python – guida passo‑passo + +Se hai bisogno di **convertire HTML in Markdown**, questa guida ti mostra una soluzione completa e eseguibile in Python. Vedrai come **salvare HTML come Markdown**, scegliere il formatter corretto e abilitare solo le funzionalità di cui hai bisogno. + +Convertire HTML in Markdown è un'operazione comune quando desideri documentazione leggera, contenuti per siti statici o file di testo sotto controllo di versione. Questo tutorial copre tutto, dall'installazione della libreria alla gestione dei casi limite, così potrai applicare la tecnica a qualsiasi sorgente HTML. + +## Prerequisiti + +* Python 3.8 o versioni successive installato. +* Accesso a `pip` per installare pacchetti di terze parti. +* Familiarità di base con i tag HTML e la sintassi Markdown. + +Non sono richieste dipendenze di sistema aggiuntive perché la libreria di conversione è puramente Python. + +## Installa la libreria GroupDocs Conversion + +Il campione di codice utilizza il pacchetto Python **GroupDocs.Conversion**, che fornisce `HTMLDocument`, `MarkdownSaveOptions` e `Converter`. Installalo con: + +```bash +pip install groupdocs-conversion +``` + +> **Suggerimento:** Usa un ambiente virtuale (`python -m venv venv`) per mantenere il pacchetto isolato dagli altri progetti. + +## Passo 1: Crea un `HTMLDocument` da una stringa + +Il primo passo è avvolgere il tuo HTML grezzo in un'istanza di `HTMLDocument`. Questo oggetto astrae la sorgente, sia che provenga da una stringa, un file o un URL remoto. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Perché è importante:* `HTMLDocument` analizza il markup una sola volta, consentendo al convertitore di lavorare con una rappresentazione normalizzata invece del testo grezzo. + +## Passo 2: Configura `MarkdownSaveOptions` + +`MarkdownSaveOptions` ti permette di controllare il formato di output e quali funzionalità Markdown vengono generate. La libreria supporta due formatter: + +* **DEFAULT** – Markdown standard compatibile con CommonMark. +* **GIT** – Markdown in stile Git (aggiunge tabelle, barrato, ecc.). + +Per la maggior parte degli scenari di controllo di versione, è preferito il formatter **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Abilitare solo le funzionalità necessarie + +Puoi perfezionare l'output attivando flag di funzionalità specifici. In questo esempio manteniamo **links** e **paragraphs** disabilitando immagini, tabelle e altre costruzioni. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Perché è importante:* Limitare le funzionalità riduce la dimensione del file generato e previene elementi Markdown inattesi che gli strumenti a valle potrebbero non supportare. + +## Passo 3: Converti il documento + +Con l'`HTMLDocument` di origine e le `MarkdownSaveOptions` configurate, la conversione è una singola chiamata a `Converter.convert`. Fornisci un percorso assoluto o relativo per il file di output. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Al termine della chiamata, `output.md` contiene la rappresentazione Markdown dell'HTML originale. + +## Script completo che puoi eseguire oggi + +Di seguito trovi lo script completo e autonomo che incorpora tutti i passaggi precedenti. Salvalo come `html_to_md.py` ed esegui `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Output previsto (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +L'output corrisponde alla struttura HTML originale mostrando solo le funzionalità che abbiamo abilitato (links, paragraphs e lists). + +## Gestione dei casi limite comuni + +### Attributi `href` mancanti o malformati + +Se un tag `` manca di un `href` valido, il convertitore inserisce il testo del link senza URL. Per preservare la leggibilità, potresti voler post‑processare il Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Conversione di file HTML di grandi dimensioni + +Per file HTML di più megabyte, trasmetti lo stream di input per evitare di caricare l'intero markup in memoria: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Il processo di conversione rimane invariato perché `HTMLDocument` astrae la dimensione della sorgente. + +## Formatter alternativi + +Se preferisci CommonMark puro invece dell'output in stile Git, cambia il formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Questo produce un file Markdown più minimale, utile quando si puntano piattaforme che non supportano le estensioni Git. + +## Attività correlate che potresti esplorare dopo + +* **Convert Markdown back to HTML** – utile per l'anteprima della documentazione. +* **Export HTML to PDF** – un altro flusso di lavoro comune correlato alla **html to markdown conversion**. +* **Batch process a folder of HTML files** – itera sui file e riutilizza la stessa istanza di `MarkdownSaveOptions`. + +Tutte queste seguono lo stesso schema: crea un documento sorgente, configura le opzioni di salvataggio e chiama `Converter.convert`. + +## Conclusione + +Ora sai come **convertire HTML in Markdown** in Python, come **salvare HTML come Markdown** con un controllo preciso delle funzionalità, e perché la scelta del formatter giusto è importante per gli strumenti a valle. L'esempio dimostra un approccio pulito e riutilizzabile che funziona per stringhe singole, file o URL, e include suggerimenti per gestire link mancanti e input di grandi dimensioni. + +Sentiti libero di sperimentare con ulteriori `MarkdownSaveOptions.Features` (ad es., `IMAGE`, `TABLE`) per adattare l'output alle esigenze del tuo progetto. Se hai trovato utile questa guida, condividila con i colleghi o collegala dalla documentazione del tuo progetto. Buona conversione! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/italian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..4bdde73aa8 --- /dev/null +++ b/html/italian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Impara a creare un documento SVG in Python, salvare l'SVG su file ed + esportare l'immagine SVG con uno script breve e completo. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: it +lastmod: 2026-10-02 +og_description: Crea un documento SVG in Python ed esporta l'immagine SVG con questo + tutorial pratico. Segui lo script, salva l'SVG su file e riutilizza il grafico vettoriale + immediatamente. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Crea un documento SVG in Python – guida passo passo +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Come creare un documento SVG ed esportarlo come immagine in Python +url: /it/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come creare un documento SVG ed esportarlo come immagine in Python + +Se hai bisogno di **creare un documento SVG** programmaticamente, questo tutorial ti mostra esattamente come farlo con Python. Vedrai uno script completo che costruisce un semplice cerchio, salva l'SVG su file e produce un'immagine SVG esportabile che puoi incorporare ovunque. + +Generare grafica vettoriale scalabile dal codice elimina lo sforzo manuale di disegnare forme in un editor GUI. Alla fine di questa guida potrai integrare la creazione di SVG nei pipeline di visualizzazione dati, nei generatori di report automatizzati o in qualsiasi progetto che richieda grafiche nitide e indipendenti dalla risoluzione. + +## Prerequisiti + +Prima di iniziare, assicurati di avere: + +- Python 3.8 o versioni successive installato +- La libreria `svgwrite` (installala con `pip install svgwrite`) +- Permessi di scrittura nella directory in cui verrà salvato l'SVG + +Questi requisiti mantengono l'esempio leggero e compatibile con la maggior parte degli ambienti. + +## Passo 1: Installa e importa la libreria SVG + +Il primo passo è aggiungere la libreria di terze parti che fornisce un'API comoda per la creazione di SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` astrae la struttura XML di un file SVG, permettendoti di concentrarti sulla geometria invece che sul markup grezzo. + +## Passo 2: Crea un oggetto documento SVG + +Ora puoi **creare un documento SVG** istanziando `svgwrite.Drawing`. Questo oggetto rappresenta l'elemento radice `` e contiene tutte le forme successive. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +L'argomento `size` definisce le dimensioni in pixel renderizzate, mentre `viewBox` stabilisce un sistema di coordinate che corrisponde alla geometria che definirai più avanti. + +## Passo 3: Aggiungi un elemento cerchio + +Un cerchio è definito dal suo centro (`cx`, `cy`) e dal raggio (`r`). Usa l'helper `circle` per impostare questi attributi. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Il cerchio si trova al centro della tela 100 × 100, lasciando un margine di 10 pixel su ogni lato. Regola `fill` e `stroke` per adattarli al tuo linguaggio di design. + +## Passo 4: Salva l'SVG su file + +Con la grafica assemblata, puoi **salvare l'SVG su file** usando il metodo `save`. Questo scrive XML ben formato che browser e editor vettoriali comprendono. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Il file `circle.svg` ora risiede nella directory di lavoro corrente. Puoi aprirlo in un browser web, Inkscape o qualsiasi strumento che supporti il formato SVG. + +## Passo 5: Verifica l'immagine SVG esportata + +Apri il file salvato in un browser per confermare l'output. Dovresti vedere un cerchio centrato con i colori specificati. L'XML grezzo appare così: + +```xml + + + + +``` + +Poiché SVG è basato su vettori, puoi scalare l'immagine senza perdita di qualità, rendendola ideale per design web responsivi o stampa ad alta risoluzione. + +## Consiglio professionale: Esporta SVG come PNG o JPEG + +Se ti serve una versione raster, combina il file SVG con uno strumento di conversione come **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Questo passo dimostra **esportare l'immagine SVG** in un formato bitmap, utile quando i sistemi a valle non possono renderizzare SVG direttamente. + +## Varianti comuni e casi limite + +| Variante | Come gestirla | +|----------|---------------| +| Forme multiple | Chiama `dwg.add()` per ogni nuovo elemento (rect, line, path). | +| Dimensioni dinamiche | Calcola `size` e `viewBox` dai dati prima di creare `Drawing`. | +| Etichette di testo | Usa `dwg.text("Label", insert=("10", "20"))` e stilizza con `font_size` e `fill`. | +| Riutilizzare il documento | Mantieni l'oggetto `Drawing` in memoria e chiama `save()` ogni volta che ti serve un file aggiornato. | +| File di grandi dimensioni | Trasmetti l'output usando `dwg.tostring()` e scrivi su un oggetto file manualmente per evitare picchi di memoria. | + +Affrontare questi scenari garantisce che il tuo script **come generare SVG** si adatti da icone semplici a diagrammi complessi. + +## Riepilogo script completo + +Di seguito trovi l'esempio completo, eseguibile, che incorpora tutti i passaggi e la conversione opzionale: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Eseguendo questo script otterrai `circle.svg` e, se `cairosvg` è installato, `circle.png`. Entrambi i file sono pronti per essere inseriti in pagine web, report o ulteriori elaborazioni. + +## Conclusione + +Ora sai come **creare un documento SVG** in Python, **salvare l'SVG su file** e **esportare l'immagine SVG** per un uso più ampio. L'esempio copre le chiamate API essenziali, spiega perché ogni passo è importante e offre estensioni per grafiche più complesse. + +Successivamente, esplora altri argomenti del **tutorial SVG Python** come il disegno di percorsi, l'applicazione di gradienti e l'animazione di elementi. Integrare queste tecniche ti permetterà di generare grafica vettoriale dinamica e guidata dai dati direttamente dalle tue applicazioni Python. Buon coding! + +## Cosa dovresti imparare dopo? + +I seguenti tutorial coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità API aggiuntive ed esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Crea e gestisci documenti SVG in Aspose.HTML per Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Salva documento SVG in Aspose.HTML per Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Converti SVG in immagine con Aspose.HTML per Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/italian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..e2afc881c3 --- /dev/null +++ b/html/italian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Scopri come caricare un documento HTML in Python con HtmlSaveOptions + e lo streaming per elaborare file HTML di grandi dimensioni in modo efficiente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: it +lastmod: 2026-10-02 +og_description: Carica un documento HTML in Python usando HtmlSaveOptions e lo streaming. + Questo tutorial mostra una soluzione completa, pronta per l'uso, per file HTML di + grandi dimensioni. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Carica documento HTML con streaming in Python – guida passo passo +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Come caricare un documento HTML in streaming con Python +url: /it/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come caricare un documento html con streaming in Python + +Se hai bisogno di **load html document** file che sono di diverse centinaia di megabyte o più grandi, ti imbatterai rapidamente in problemi di utilizzo della memoria. Questa guida ti mostra una soluzione completa, pronta all'uso, che utilizza **HTML streaming** per mantenere basso il consumo di memoria pur fornendoti pieno accesso al contenuto del documento. + +Imparerai come configurare `HtmlSaveOptions`, abilitare lo streaming e salvare il file elaborato—tutto in soli tre passaggi concisi. Non sono necessari strumenti esterni oltre al pacchetto Python standard `aspose.html`, rendendo l'approccio ideale per lavori batch, pipeline lato server o script locali che gestiscono **large HTML files**. + +## Prerequisiti + +* Python 3.8 o versioni successive installato. +* La libreria `aspose.html` (`pip install aspose-html`) – fornisce `HTMLDocument` e `HtmlSaveOptions`. +* Una directory che contiene il file HTML grande con cui vuoi lavorare (ad es., `large.html`). + +Questi requisiti sono minimi, così puoi concentrarti sulla logica di base per caricare un documento HTML in modo efficiente. + +## Passo 1: Caricare il documento HTML + +La prima operazione è creare un'istanza di `HTMLDocument` che punti al file di origine. Questo oggetto rappresenta l'operazione **load html document** e analizza il markup in modo lazy, il che è essenziale per gestire file di grandi dimensioni. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Perché è importante:** +La creazione dell'oggetto `HTMLDocument` non legge immediatamente l'intero file in memoria. Invece, prepara un parser in streaming che preleverà i dati dal disco secondo necessità. Questo design ti permette di lavorare con file che superano la RAM della tua macchina. + +## Passo 2: Abilitare lo streaming con HtmlSaveOptions + +Per mantenere basso l'ingombro di memoria mentre manipoli o salvi il documento, devi abilitare la modalità streaming su `HtmlSaveOptions`. Questa parola chiave secondaria, **HtmlSaveOptions**, controlla come la libreria scrive il file di output. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Perché abilitare lo streaming?** +Quando `enable_streaming` è impostato su `True`, la libreria scrive l'output a blocchi invece di bufferizzare l'intero risultato in memoria. Questo è cruciale quando in seguito **save the document** o esegui trasformazioni su **large HTML files**. + +## Passo 3: Salvare il documento con le opzioni configurate + +Ora che lo streaming è attivo, puoi scrivere in modo sicuro il contenuto elaborato in un nuovo file. Il metodo `save` rispetta le `HtmlSaveOptions` configurate, garantendo che l'operazione rimanga efficiente in termini di memoria. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Cosa succede dietro le quinte:** +La chiamata `save` trasmette il markup HTML a `large_out.html` pezzo per pezzo. Poiché il documento è stato caricato con il parser in streaming, l'intera pipeline—dal caricamento al salvataggio—opera con un utilizzo di memoria costante e basso. + +## Esempio completo funzionante + +Unendo i tre passaggi ottieni uno script compatto che puoi eseguire direttamente dalla riga di comando: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Output previsto** + +Quando esegui lo script (`python load_html_document_streaming.py`), dovresti vedere: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Il file `large_out.html` sarà una copia fedele dell'originale, ma è stato elaborato senza mai caricare l'intero file in RAM. + +## Domande comuni e gestione dei casi limite + +### Funziona con file HTML che contengono risorse esterne (immagini, CSS, script)? + +Sì. Il parser in streaming tratta i riferimenti esterni come normali attributi. Non **scarica** le risorse a meno che non le richiedi esplicitamente. Se hai bisogno di incorporare quelle risorse, puoi utilizzare API aggiuntive da `aspose.html` dopo che il documento è stato caricato. + +### Cosa succede se il file di origine è corrotto o non è HTML ben formato? + +`HTMLDocument` cercherà di recuperare da errori minori, ma malformazioni gravi sollevano un'eccezione. Avvolgi il passaggio di caricamento in un blocco `try/except` per gestire questi casi in modo elegante: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Posso modificare il DOM prima di salvare? + +Assolutamente. Dopo il caricamento, hai pieno accesso all'albero DOM (`html_doc.dom`). Puoi inserire nodi, rimuovere elementi o modificare attributi, e poi chiamare `save` con lo streaming ancora abilitato. L'utilizzo della memoria rimarrà basso perché le modifiche vengono applicate in modo incrementale. + +### Lo streaming influisce sulla qualità dell'output? + +No. L'output in streaming è byte‑per‑byte identico a quello che otterresti da un salvataggio non‑streaming, a condizione che non abbia apportato modifiche al DOM. Lo streaming cambia solo il modo in cui i dati vengono scritti, non ciò che viene scritto. + +## Consiglio di performance: misurare l'uso della memoria + +Se vuoi verificare che lo streaming riduca davvero il consumo di memoria, puoi utilizzare la libreria `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Di solito vedrai solo pochi megabyte di RAM utilizzati, anche per file HTML da 500 MB. + +## Conclusione + +In questo tutorial hai imparato come **load html document** in modo efficiente in Python facendo: + +1. Istanziare `HTMLDocument` per analizzare il file in modo lazy. +2. Configurare `HtmlSaveOptions` con `enable_streaming = True` per scritture a bassa memoria. +3. Salvare il documento mentre si streamma l'output su disco. + +Questi tre passaggi ti offrono un modello robusto per elaborare **large HTML files** usando tecniche di **Python HTML processing**. Da qui puoi estendere lo script per modificare il DOM, estrarre dati o processare in batch decine di file—tutto mantenendo l'uso della memoria prevedibile. + +**Passi successivi** + +* Esplora l'API DOM di `aspose.html` per estrarre tabelle, link o immagini. +* Combina questo approccio con il multithreading per processare più file in parallelo. +* Approfondisci `HtmlLoadOptions` se devi controllare la codifica dei caratteri o altre sfumature di parsing. + +Buon coding e goditi il modo a basso consumo di memoria per **load html document** su larga scala! + +## Cosa dovresti imparare dopo? + +I seguenti tutorial coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità API aggiuntive ed esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Caricare documento HTML Java – Guida completa con XPath e CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Caricare HTML usando URL in .NET con Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Come abilitare JavaScript in Aspose HTML – Caricare HTML e ottenere testo](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/japanese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..2a30853be5 --- /dev/null +++ b/html/japanese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-10-02 +description: PythonでHTMLをMarkdownに変換する完全な例。HTMLをMarkdownとして保存する方法、フォーマッタの選択、特定の機能の有効化を学びましょう。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: ja +lastmod: 2026-10-02 +og_description: 実用的なコード、フォーマッタオプション、機能フラグを使用して、PythonでHTMLをMarkdownに変換します。このガイドに従って、HTMLをすばやくMarkdownとして保存しましょう。 +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: PythonでHTMLをMarkdownに変換する – 完全チュートリアル +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: PythonでHTMLをMarkdownに変換する方法 – ステップバイステップガイド +url: /ja/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# PythonでHTMLをMarkdownに変換する方法 – ステップバイステップガイド + +HTMLを**Markdownに変換**したい場合、このガイドではPythonで実行可能な完全なソリューションを示します。**HTMLをMarkdownとして保存**する方法、適切なフォーマッタの選び方、必要な機能だけを有効にする方法が分かります。 + +HTMLをMarkdownに変換することは、軽量なドキュメント、静的サイトのコンテンツ、またはバージョン管理されたテキストファイルが必要なときに一般的な作業です。このチュートリアルでは、ライブラリのインストールからエッジケースの処理までを網羅しているので、任意のHTMLソースにこの手法を適用できます。 + +## Prerequisites + +開始する前に、以下を確認してください: + +* Python 3.8以上がインストールされていること。 +* `pip` でサードパーティパッケージをインストールできること。 +* HTMLタグとMarkdown構文の基本的な知識があること。 + +変換ライブラリは純粋なPythonで実装されているため、追加のシステム依存関係は不要です。 + +## Install the GroupDocs Conversion library + +コードサンプルでは **GroupDocs.Conversion** Python パッケージを使用しています。このパッケージは `HTMLDocument`、`MarkdownSaveOptions`、`Converter` を提供します。以下のコマンドでインストールしてください。 + +```bash +pip install groupdocs-conversion +``` + +> **プロのコツ:** 仮想環境(`python -m venv venv`)を使用して、パッケージを他のプロジェクトから分離しましょう。 + +## Step 1: Create an `HTMLDocument` from a string + +最初のステップは、生のHTMLを `HTMLDocument` インスタンスでラップすることです。このオブジェクトは、文字列、ファイル、またはリモートURLから取得したソースを抽象化します。 + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*なぜ重要か:* `HTMLDocument` はマークアップを一度だけ解析し、コンバータが生のテキストではなく正規化された表現で作業できるようにします。 + +## Step 2: Configure `MarkdownSaveOptions` + +`MarkdownSaveOptions` を使うと、出力フォーマットと生成されるMarkdown機能を制御できます。ライブラリは以下の2つのフォーマッタをサポートしています: + +* **DEFAULT** – 標準的な CommonMark 互換 Markdown。 +* **GIT** – Git フレーバーの Markdown(テーブル、取り消し線などを追加)。 + +ほとんどのバージョン管理シナリオでは、**GIT** フォーマッタが推奨されます。 + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Enabling only the needed features + +特定の機能フラグをオンにすることで出力を細かく調整できます。この例では、**リンク** と **段落** は有効にし、画像、テーブル、その他の構造は無効にしています。 + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*なぜ重要か:* 機能を限定することで生成ファイルのサイズが削減され、下流ツールがサポートしない予期せぬMarkdown要素の出現を防げます。 + +## Step 3: Convert the document + +ソースの `HTMLDocument` と設定済みの `MarkdownSaveOptions` が揃ったら、`Converter.convert` を一度呼び出すだけで変換が完了します。出力ファイルの絶対パスまたは相対パスを指定してください。 + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +呼び出しが完了すると、`output.md` に元のHTMLのMarkdown表現が格納されます。 + +## Full script you can run today + +以下は、これまでの手順をすべて組み込んだ完全な単一スクリプトです。`html_to_md.py` として保存し、`python html_to_md.py` を実行してください。 + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Expected output (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +出力は元のHTML構造と一致しつつ、有効にした機能(リンク、段落、リスト)のみが含まれます。 + +## Handling common edge cases + +### Missing or malformed `href` attributes + +`` タグに有効な `href` がない場合、コンバータはURLなしでリンクテキストだけを挿入します。可読性を保つために、Markdownを後処理したい場合があります: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Converting large HTML files + +数メガバイト規模のHTMLファイルを扱う場合は、入力をストリーム処理してマークアップ全体をメモリに読み込まないようにします: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +変換プロセス自体は変わりません。`HTMLDocument` がソースサイズを抽象化しているためです。 + +## Alternative formatters + +プレーンなCommonMarkを好む場合は、Gitフレーバー出力からフォーマッタを切り替えてください: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +これにより、Git拡張をサポートしないプラットフォーム向けに、よりミニマルなMarkdownファイルが生成されます。 + +## Related tasks you might explore next + +* **MarkdownをHTMLに戻す** – ドキュメントのプレビューに便利です。 +* **HTMLをPDFにエクスポート** – もう一つの一般的な **html to markdown conversion** に関連するワークフローです。 +* **HTMLファイルのフォルダを一括処理** – ファイルをループし、同じ `MarkdownSaveOptions` インスタンスを再利用します。 + +これらすべては同じパターンに従います:ソースドキュメントを作成し、保存オプションを設定し、`Converter.convert` を呼び出す。 + +## Conclusion + +これで、Pythonで**HTMLをMarkdownに変換**する方法、**HTMLをMarkdownとして保存**する際の正確な機能制御、そして下流ツールに適したフォーマッタ選択の重要性が分かりました。例は、文字列、ファイル、URL のいずれにも対応できるクリーンで再利用可能なアプローチを示しており、リンクが欠落している場合や大容量入力の処理に関するヒントも含んでいます。 + +`MarkdownSaveOptions.Features`(例:`IMAGE`、`TABLE`)を追加で試して、プロジェクトの要件に合わせて出力をカスタマイズしてください。このガイドが役立ったら、チームメンバーと共有したり、プロジェクトのドキュメントにリンクしたりしてください。変換を楽しんでください! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/japanese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..af5eab656c --- /dev/null +++ b/html/japanese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,212 @@ +--- +category: general +date: 2026-10-02 +description: PythonでSVGドキュメントを作成し、SVGをファイルに保存し、短くて完全なスクリプトでSVG画像をエクスポートする方法を学びましょう。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: ja +lastmod: 2026-10-02 +og_description: PythonでSVGドキュメントを作成し、この実用的なチュートリアルでSVG画像をエクスポートします。スクリプトに従ってSVGをファイルに保存し、ベクターグラフィックをすぐに再利用できます。 +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: PythonでSVGドキュメントを作成する – ステップバイステップガイド +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: PythonでSVGドキュメントを作成し、画像としてエクスポートする方法 +url: /ja/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# PythonでSVGドキュメントを作成し画像としてエクスポートする方法 + +プログラムで **SVGドキュメントを作成** したい場合、このチュートリアルで Python を使った具体的な手順を示します。シンプルな円を描画し、SVG をファイルに保存し、どこにでも埋め込めるエクスポート可能な SVG 画像を生成する完全なスクリプトをご覧いただけます。 + +コードからスケーラブルベクターグラフィックスを生成すれば、GUI エディタで手動で図形を描く手間が省けます。このガイドを終える頃には、SVG 作成をデータ可視化パイプラインや自動レポート生成ツール、あるいは高解像度でクリアなグラフィックが必要なあらゆるプロジェクトに組み込めるようになります。 + +## 前提条件 + +開始する前に、以下を確認してください。 + +- Python 3.8 以上がインストールされていること +- `svgwrite` ライブラリ(`pip install svgwrite` でインストール) +- SVG を保存するディレクトリへの書き込み権限 + +これらの要件により、サンプルは軽量でほとんどの環境に対応できます。 + +## 手順 1: SVG ライブラリをインストールしてインポートする + +まず、SVG 作成用の便利な API を提供するサードパーティライブラリを追加します。 + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` は SVG ファイルの XML 構造を抽象化し、マークアップの詳細ではなくジオメトリに集中できるようにします。 + +## 手順 2: SVG ドキュメントオブジェクトを作成する + +`svgwrite.Drawing` をインスタンス化することで **SVGドキュメントを作成** できます。このオブジェクトはルート `` 要素を表し、以降のすべての形状を保持します。 + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` 引数はピクセル単位の描画サイズを定義し、`viewBox` は後で定義するジオメトリに合わせた座標系を設定します。 + +## 手順 3: 円要素を追加する + +円は中心座標 (`cx`, `cy`) と半径 (`r`) で定義されます。`circle` ヘルパーを使ってこれらの属性を付与します。 + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +円は 100 × 100 のキャンバスの中央に配置され、各辺に 10 ピクセルの余白が残ります。`fill` や `stroke` を調整してデザインに合わせましょう。 + +## 手順 4: SVG をファイルに保存する + +グラフィックが完成したら、`save` メソッドを使って **SVGをファイルに保存** できます。これにより、ブラウザやベクターエディタが理解できる整形式の XML が書き出されます。 + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +`circle.svg` ファイルが現在の作業ディレクトリに作成されました。ウェブブラウザ、Inkscape、または SVG をサポートする任意のツールで開くことができます。 + +## 手順 5: エクスポートされた SVG 画像を確認する + +保存したファイルをブラウザで開き、出力結果を確認してください。指定した色で中央に円が表示されるはずです。生の XML は次のようになります。 + +```xml + + + + +``` + +SVG はベクターベースなので、品質を損なうことなく画像を拡大縮小でき、レスポンシブウェブデザインや高解像度印刷に最適です。 + +## プロのコツ: SVG を PNG または JPEG にエクスポートする + +ラスタ画像が必要な場合は、**CairoSVG** などの変換ツールと組み合わせます。 + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +この手順は **SVG画像をエクスポート** してビットマップ形式に変換する例で、下流システムが直接 SVG をレンダリングできない場合に便利です。 + +## よくあるバリエーションとエッジケース + +| Variation | How to handle | +|-----------|---------------| +| Multiple shapes | `dwg.add()` を各新要素(rect、line、path)に対して呼び出す。 | +| Dynamic dimensions | `Drawing` 作成前にデータから `size` と `viewBox` を計算する。 | +| Text labels | `dwg.text("Label", insert=("10", "20"))` を使用し、`font_size` と `fill` でスタイル設定。 | +| Re‑using the document | `Drawing` オブジェクトをメモリ上に保持し、更新が必要なときに `save()` を呼び出す。 | +| Large files | `dwg.tostring()` で出力をストリームし、手動でファイルオブジェクトに書き込んでメモリスパイクを回避する。 | + +これらのシナリオに対応すれば、**SVG生成方法** スクリプトはシンプルなアイコンから複雑な図までスケールします。 + +## 完全スクリプトのまとめ + +以下に、すべての手順とオプションの変換を組み込んだ実行可能な完全例を示します。 + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +このスクリプトを実行すると `circle.svg` が生成され、`cairosvg` がインストールされていれば `circle.png` も生成されます。どちらのファイルもウェブページ、レポート、あるいはさらなる処理にすぐに利用できます。 + +## 結論 + +Python で **SVGドキュメントを作成** し、**SVGをファイルに保存**、さらに **SVG画像をエクスポート** する方法が理解できたはずです。例は重要な API 呼び出しを網羅し、各ステップの意義を解説し、より高度なグラフィック向けの拡張方法も提示しています。 + +次は、パスの描画、グラデーションの適用、要素のアニメーションなど、追加の **SVG Python チュートリアル** トピックを探求してください。これらのテクニックを統合すれば、Python アプリケーションから動的でデータ駆動型のベクターグラフィックを直接生成できます。コーディングを楽しんでください! + +## 次に学ぶべきこと + +以下のチュートリアルは、本ガイドで示した手法を基にした関連トピックをカバーしています。各リソースには、ステップバイステップの解説と完全な動作コード例が含まれており、API の追加機能を習得したり、独自プロジェクトで代替実装アプローチを試したりするのに役立ちます。 + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/japanese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..de5c8823ae --- /dev/null +++ b/html/japanese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: HtmlSaveOptions とストリーミングを使用して、Python で HTML ドキュメントを読み込み、大きな HTML ファイルを効率的に処理する方法を学びましょう。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: ja +lastmod: 2026-10-02 +og_description: HtmlSaveOptions とストリーミングを使用して Python で HTML ドキュメントを読み込む。このチュートリアルでは、大きな + HTML ファイル向けの完全な、すぐに実行できるソリューションを示します。 +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Pythonでストリーミングを使ってHTMLドキュメントを読み込む – ステップバイステップガイド +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Pythonでストリーミングを使用してHTMLドキュメントを読み込む方法 +url: /ja/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python でストリーミングを使用して HTML ドキュメントを読み込む方法 + +数百メガバイト以上の **load html document** ファイルを扱う必要がある場合、メモリ使用量の問題にすぐに直面します。このガイドでは、**HTML streaming** を利用してメモリ消費を抑えつつ、ドキュメントの内容にフルアクセスできる、完全に実行可能なソリューションを示します。 + +`HtmlSaveOptions` の設定方法、ストリーミングの有効化、処理済みファイルの保存まで、たった 3 つの簡潔な手順で学べます。標準の `aspose.html` Python パッケージ以外の外部ツールは不要なので、バッチジョブ、サーバーサイドパイプライン、または **large HTML files** を扱うローカルスクリプトに最適です。 + +## 前提条件 + +開始する前に、以下が揃っていることを確認してください。 + +* Python 3.8 以上がインストールされていること。 +* `aspose.html` ライブラリ(`pip install aspose-html`) – これにより `HTMLDocument` と `HtmlSaveOptions` が利用可能になります。 +* 処理対象となる大きな HTML ファイルが格納されたディレクトリ(例: `large.html`)。 + +これらの要件は最小限なので、HTML ドキュメントを効率的に読み込むコアロジックに集中できます。 + +## 手順 1: HTML ドキュメントを読み込む + +最初の操作は、ソースファイルを指す `HTMLDocument` インスタンスを作成することです。このオブジェクトは **load html document** 操作を表し、マークアップを遅延的にパースします。大容量ファイルを扱う際に重要です。 + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**なぜ重要か:** +`HTMLDocument` オブジェクトの作成時には、ファイル全体をメモリに読み込むことはありません。代わりに、必要に応じてディスクからデータを取得するストリーミングパーサが準備されます。この設計により、マシンの RAM を超えるファイルでも扱えるようになります。 + +## 手順 2: HtmlSaveOptions でストリーミングを有効化 + +ドキュメントを操作または保存する際にメモリフットプリントを低く保つため、`HtmlSaveOptions` のストリーミングモードを有効にする必要があります。この二次キーワード **HtmlSaveOptions** は、ライブラリが出力ファイルを書き込む方法を制御します。 + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**ストリーミングを有効にする理由:** +`enable_streaming` を `True` に設定すると、ライブラリは結果全体をメモリにバッファせず、チャンク単位で出力を書き込みます。これは、後で **save the document** したり、**large HTML files** に対して変換を行う際に不可欠です。 + +## 手順 3: 設定したオプションでドキュメントを保存 + +ストリーミングが有効になったので、処理済みコンテンツを新しいファイルに安全に書き込めます。`save` メソッドは構成した `HtmlSaveOptions` を尊重し、メモリ効率の高い操作を保証します。 + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**内部で何が起きているか:** +`save` 呼び出しは HTML マークアップを `large_out.html` に少しずつストリーミングします。ドキュメントはストリーミングパーサで読み込まれたため、ロードから保存までのパイプライン全体が一定かつ低いメモリ使用量で動作します。 + +## 完全な動作例 + +上記 3 つの手順を組み合わせると、コマンドラインから直接実行できるコンパクトなスクリプトが完成します。 + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**期待される出力** + +スクリプト(`python load_html_document_streaming.py`)を実行すると、次のような出力が表示されます。 + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` ファイルは元のファイルと同一の内容になりますが、全体を RAM に読み込むことなく処理されています。 + +## よくある質問とエッジケースの対処 + +### 外部リソース(画像、CSS、スクリプト)を含む HTML ファイルでも動作しますか? + +はい。ストリーミングパーサは外部参照を普通の属性として扱います。明示的にリクエストしない限り、リソースはダウンロードされません。必要に応じて、ドキュメント読み込み後に `aspose.html` の追加 API を使用してリソースを埋め込むことができます。 + +### ソースファイルが破損している、または HTML が正しく構成されていない場合は? + +`HTMLDocument` は軽微なエラーからの復旧を試みますが、深刻な不正構造は例外をスローします。以下のように `try/except` ブロックでロードステップをラップし、例外を適切に処理してください。 + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### 保存前に DOM を変更できますか? + +もちろんです。ロード後は `html_doc.dom` を通じて DOM ツリーにフルアクセスできます。ノードの挿入、要素の削除、属性の変更などを行い、ストリーミングが有効なまま `save` を呼び出せます。変更はインクリメンタルに適用されるため、メモリ使用量は低く保たれます。 + +### ストリーミングは出力品質に影響しますか? + +影響しません。ストリーミングされた出力は、DOM を変更していない限り、非ストリーミング保存とバイト単位で同一です。ストリーミングはデータの書き込み方法を変えるだけで、書き込まれる内容は変わりません。 + +## パフォーマンスのヒント: メモリ使用量を測定する + +ストリーミングが実際にメモリ消費を削減しているか確認したい場合は、`psutil` ライブラリを使用できます。 + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +500 MB の HTML ファイルでも、使用される RAM は数メガバイト程度に抑えられることが一般的です。 + +## 結論 + +このチュートリアルでは、Python で **load html document** を効率的に行う方法を学びました。 + +1. `HTMLDocument` をインスタンス化し、遅延パースを実現。 +2. `HtmlSaveOptions` の `enable_streaming = True` を設定し、低メモリ書き込みを実現。 +3. ストリーミング出力でドキュメントを保存。 + +この 3 手順により、**large HTML files** を **Python HTML processing** 手法で処理する堅牢なパターンが得られます。ここからさらに DOM を変更したり、データを抽出したり、数十ファイルをバッチ処理したりと、メモリ使用量を予測可能なまま拡張できます。 + +**次のステップ** + +* `aspose.html` の DOM API を探索し、テーブル、リンク、画像の抽出方法を学ぶ。 +* この手法をマルチスレッドと組み合わせ、複数ファイルを並列処理する。 +* 文字エンコーディングやその他のパース細部を制御したい場合は `HtmlLoadOptions` を検討する。 + +Happy coding, and enjoy the memory‑friendly way to **load html document** at scale! + +## 次に学ぶべきこと + +以下のチュートリアルは、本ガイドで示したテクニックを基にした関連トピックを扱っています。各リソースには、ステップバイステップの解説と完全なコード例が含まれており、API の追加機能を習得したり、独自プロジェクトで代替実装アプローチを探求したりするのに役立ちます。 + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/korean/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..99ea5237fd --- /dev/null +++ b/html/korean/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Python에서 HTML을 Markdown으로 변환하기(전체 예제 포함). HTML을 Markdown으로 저장하는 방법, 포맷터 + 선택 방법, 특정 기능 활성화 방법을 배워보세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: ko +lastmod: 2026-10-02 +og_description: 실용적인 코드, 포매터 옵션 및 기능 플래그와 함께 Python에서 HTML을 Markdown으로 변환합니다. 이 가이드를 + 따라 HTML을 빠르게 Markdown으로 저장하세요. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Python에서 HTML을 Markdown으로 변환하기 – 전체 튜토리얼 +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Python에서 HTML을 Markdown으로 변환하는 방법 – 단계별 가이드 +url: /ko/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python에서 HTML을 Markdown으로 변환하는 방법 – 단계별 가이드 + +HTML을 **Markdown으로 변환**해야 한다면, 이 가이드는 Python에서 완전하고 실행 가능한 솔루션을 보여줍니다. **HTML을 Markdown으로 저장**하는 방법, 올바른 포맷터 선택, 그리고 필요한 기능만 활성화하는 방법을 확인할 수 있습니다. + +HTML을 Markdown으로 변환하는 것은 가벼운 문서, 정적 사이트 콘텐츠, 혹은 버전 관리되는 텍스트 파일이 필요할 때 흔히 수행되는 작업입니다. 이 튜토리얼은 라이브러리 설치부터 엣지 케이스 처리까지 모든 과정을 다루므로, 어떤 HTML 소스에도 이 기술을 적용할 수 있습니다. + +## 사전 요구 사항 + +시작하기 전에 다음이 준비되어 있는지 확인하세요: + +* Python 3.8 이상이 설치되어 있어야 합니다. +* `pip`를 사용해 서드파티 패키지를 설치할 수 있어야 합니다. +* HTML 태그와 Markdown 문법에 대한 기본적인 이해가 필요합니다. + +변환 라이브러리는 순수 Python으로 구현되어 있어 추가 시스템 의존성이 없습니다. + +## GroupDocs Conversion 라이브러리 설치 + +코드 샘플은 `HTMLDocument`, `MarkdownSaveOptions`, `Converter`를 제공하는 **GroupDocs.Conversion** Python 패키지를 사용합니다. 다음 명령으로 설치하세요: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** 가상 환경(`python -m venv venv`)을 사용하면 패키지를 다른 프로젝트와 격리할 수 있습니다. + +## 단계 1: 문자열에서 `HTMLDocument` 만들기 + +첫 번째 단계는 원시 HTML 문자열을 `HTMLDocument` 인스턴스로 감싸는 것입니다. 이 객체는 문자열, 파일, 원격 URL 등 소스가 어디에서 오든 추상화합니다. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*왜 중요한가:* `HTMLDocument`는 마크업을 한 번 파싱하여 변환기가 원시 텍스트가 아닌 정규화된 표현을 사용하도록 합니다. + +## 단계 2: `MarkdownSaveOptions` 구성 + +`MarkdownSaveOptions`를 사용하면 출력 형식과 생성되는 Markdown 기능을 제어할 수 있습니다. 라이브러리는 두 가지 포맷터를 지원합니다: + +* **DEFAULT** – 표준 CommonMark 호환 Markdown. +* **GIT** – Git‑flavored Markdown(테이블, 취소선 등 추가). + +대부분의 버전 관리 시나리오에서는 **GIT** 포맷터가 선호됩니다. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### 필요한 기능만 활성화하기 + +특정 기능 플래그만 켜서 출력을 세밀하게 조정할 수 있습니다. 아래 예시에서는 **링크**와 **단락**은 유지하고 이미지, 테이블 및 기타 구성 요소는 비활성화합니다. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*왜 중요한가:* 기능을 제한하면 생성 파일 크기가 줄어들고, 다운스트림 도구가 지원하지 않을 수 있는 예기치 않은 Markdown 요소를 방지할 수 있습니다. + +## 단계 3: 문서 변환 + +소스 `HTMLDocument`와 구성된 `MarkdownSaveOptions`가 준비되면 `Converter.convert`를 한 번 호출하면 됩니다. 출력 파일에 대한 절대 경로나 상대 경로를 지정하세요. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +호출이 완료되면 `output.md`에 원본 HTML의 Markdown 표현이 저장됩니다. + +## 오늘 바로 실행할 수 있는 전체 스크립트 + +아래는 앞서 설명한 모든 단계를 포함한 완전하고 독립적인 스크립트입니다. `html_to_md.py`라는 이름으로 저장하고 `python html_to_md.py`를 실행하세요. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### 예상 출력 (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +출력은 원본 HTML 구조와 일치하면서 우리가 활성화한 기능(링크, 단락, 리스트)만 노출합니다. + +## 일반적인 엣지 케이스 처리 + +### 누락되었거나 잘못된 `href` 속성 + +`` 태그에 유효한 `href`가 없으면 변환기는 URL 없이 링크 텍스트만 삽입합니다. 가독성을 유지하려면 Markdown을 후처리할 수 있습니다: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### 대용량 HTML 파일 변환 + +수 메가바이트 규모의 HTML 파일을 처리할 때는 전체 마크업을 메모리에 로드하지 않도록 스트리밍 입력을 사용하세요: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +`HTMLDocument`가 소스 크기를 추상화하기 때문에 변환 과정 자체는 변경되지 않습니다. + +## 대체 포맷터 + +Plain CommonMark가 필요하고 Git‑flavored 출력을 원하지 않을 경우 포맷터를 전환하세요: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +이렇게 하면 Git 확장을 지원하지 않는 플랫폼을 대상으로 할 때 유용한 보다 최소화된 Markdown 파일이 생성됩니다. + +## 다음에 탐색할 수 있는 관련 작업 + +* **Markdown을 HTML로 다시 변환** – 문서 미리보기에 유용합니다. +* **HTML을 PDF로 내보내기** – 또 다른 일반적인 **html to markdown conversion** 인접 워크플로우. +* **HTML 파일 폴더를 일괄 처리** – 파일을 순회하면서 동일한 `MarkdownSaveOptions` 인스턴스를 재사용합니다. + +이 모든 작업은 동일한 패턴을 따릅니다: 소스 문서를 만들고, 저장 옵션을 구성하고, `Converter.convert`를 호출합니다. + +## 결론 + +이제 Python에서 **HTML을 Markdown으로 변환**하는 방법, **HTML을 Markdown으로 저장**하면서 정확한 기능 제어를 하는 방법, 그리고 다운스트림 도구에 맞는 올바른 포맷터 선택이 왜 중요한지 알게 되었습니다. 이 예시는 단일 문자열, 파일, URL에 모두 적용 가능한 깔끔하고 재사용 가능한 접근 방식을 보여주며, 누락된 링크와 대용량 입력을 처리하는 팁도 포함합니다. + +추가 `MarkdownSaveOptions.Features`(예: `IMAGE`, `TABLE`)를 실험해 프로젝트 요구에 맞게 출력을 맞춤화해 보세요. 이 가이드가 도움이 되었다면 팀원과 공유하거나 프로젝트 문서에 링크를 추가하세요. 즐거운 변환 작업 되세요! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/korean/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..94a5ac5964 --- /dev/null +++ b/html/korean/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,216 @@ +--- +category: general +date: 2026-10-02 +description: Python에서 SVG 문서를 만드는 방법, SVG를 파일에 저장하는 방법, 그리고 짧고 완전한 스크립트로 SVG 이미지를 + 내보내는 방법을 배워보세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: ko +lastmod: 2026-10-02 +og_description: Python으로 SVG 문서를 만들고 이 실용적인 튜토리얼을 통해 SVG 이미지를 내보내세요. 스크립트를 따라 SVG를 + 파일에 저장하고 벡터 그래픽을 즉시 재사용하세요. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Python으로 SVG 문서 만들기 – 단계별 가이드 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Python에서 SVG 문서를 만들고 이미지를 내보내는 방법 +url: /ko/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python에서 SVG 문서를 생성하고 이미지로 내보내는 방법 + +프로그램matically **SVG 문서를 생성**해야 할 때, 이 튜토리얼에서는 Python으로 정확히 어떻게 하는지 보여줍니다. 간단한 원을 만들고, SVG를 파일에 저장하며, 어디서든 삽입할 수 있는 내보내기 가능한 SVG 이미지를 만드는 전체 스크립트를 확인해 보세요. + +코드로 확장 가능한 벡터 그래픽을 생성하면 GUI 편집기에서 수작업으로 도형을 그리는 노력을 없앨 수 있습니다. 이 가이드를 마치면 데이터 시각화 파이프라인, 자동 보고서 생성기, 혹은 선명하고 해상도에 독립적인 그래픽이 필요한 모든 프로젝트에 SVG 생성을 통합할 수 있습니다. + +## 전제 조건 + +시작하기 전에 다음이 준비되어 있는지 확인하세요: + +- Python 3.8 이상이 설치되어 있음 +- `svgwrite` 라이브러리 (`pip install svgwrite` 로 설치) +- SVG가 저장될 디렉터리에 대한 쓰기 권한 + +이 요구 사항은 예제를 가볍게 유지하고 대부분의 환경과 호환되도록 합니다. + +## 1단계: SVG 라이브러리 설치 및 임포트 + +첫 번째 단계는 SVG 생성을 위한 편리한 API를 제공하는 서드파티 라이브러리를 추가하는 것입니다. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite`는 SVG 파일의 XML 구조를 추상화하여, 원시 마크업 대신 기하학에 집중할 수 있게 해줍니다. + +## 2단계: SVG 문서 객체 생성 + +이제 `svgwrite.Drawing`을 인스턴스화하여 **SVG 문서를 생성**할 수 있습니다. 이 객체는 루트 `` 요소를 나타내며 이후 모든 도형을 보관합니다. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` 인자는 렌더링될 픽셀 크기를 정의하고, `viewBox`는 나중에 정의할 기하학과 일치하는 좌표계를 설정합니다. + +## 3단계: 원 요소 추가 + +원은 중심(`cx`, `cy`)과 반지름(`r`)으로 정의됩니다. `circle` 헬퍼를 사용해 이러한 속성을 지정합니다. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +원은 100 × 100 캔버스의 중앙에 위치하며, 각 측면에 10픽셀 여백을 남깁니다. `fill`과 `stroke`를 조정해 디자인 언어에 맞게 색상을 지정하세요. + +## 4단계: SVG를 파일에 저장 + +그래픽을 조립했으면 `save` 메서드를 사용해 **SVG를 파일에 저장**할 수 있습니다. 이렇게 하면 브라우저와 벡터 편집기가 이해할 수 있는 잘 형성된 XML이 작성됩니다. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +이제 `circle.svg` 파일이 현재 작업 디렉터리에 생성되었습니다. 웹 브라우저, Inkscape, 혹은 SVG 형식을 지원하는 어떤 도구에서도 열어볼 수 있습니다. + +## 5단계: 내보낸 SVG 이미지 확인 + +브라우저에서 저장된 파일을 열어 출력 결과를 확인하세요. 지정한 색상의 중앙 원이 보일 것입니다. 원시 XML은 다음과 같습니다: + +```xml + + + + +``` + +SVG는 벡터 기반이므로 품질 손실 없이 이미지를 확대·축소할 수 있어, 반응형 웹 디자인이나 고해상도 인쇄에 이상적입니다. + +## 팁: SVG를 PNG 또는 JPEG로 내보내기 + +래스터 버전이 필요하다면 **CairoSVG**와 같은 변환 도구와 SVG 파일을 결합하세요: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +이 단계는 **SVG 이미지를** 비트맵 형식으로 **내보내는** 방법을 보여주며, 하위 시스템이 SVG를 직접 렌더링할 수 없을 때 유용합니다. + +## 일반적인 변형 및 예외 상황 + +| 변형 | 처리 방법 | +|-----------|---------------| +| 여러 도형 | 새로운 요소(사각형, 선, 경로)마다 `dwg.add()`를 호출 | +| 동적 차원 | `Drawing`을 만들기 전에 데이터에서 `size`와 `viewBox`를 계산 | +| 텍스트 레이블 | `dwg.text("Label", insert=("10", "20"))`를 사용하고 `font_size`와 `fill`로 스타일 지정 | +| 문서 재사용 | `Drawing` 객체를 메모리에 유지하고 필요할 때마다 `save()` 호출 | +| 대용량 파일 | `dwg.tostring()`으로 출력 스트리밍 후 파일 객체에 직접 기록해 메모리 급증 방지 | + +이러한 시나리오를 다루면 **SVG 생성 방법** 스크립트가 간단한 아이콘부터 복잡한 다이어그램까지 확장 가능합니다. + +## 전체 스크립트 요약 + +아래는 모든 단계와 선택적 변환을 포함한 완전하고 실행 가능한 예제입니다: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +이 스크립트를 실행하면 `circle.svg`가 생성되고, `cairosvg`가 설치된 경우 `circle.png`도 생성됩니다. 두 파일 모두 웹 페이지, 보고서, 혹은 추가 처리에 바로 사용할 수 있습니다. + +## 결론 + +이제 Python에서 **SVG 문서를 생성**하고, **SVG를 파일에 저장**하며, **SVG 이미지를 내보내**는 방법을 알게 되었습니다. 예제는 핵심 API 호출을 다루고 각 단계가 왜 중요한지 설명하며, 더 복잡한 그래픽을 위한 확장 방법도 제시합니다. + +다음으로는 **SVG Python 튜토리얼**의 추가 주제—경로 그리기, 그라디언트 적용, 요소 애니메이션—을 탐색해 보세요. 이러한 기술을 통합하면 Python 애플리케이션에서 동적이고 데이터 기반의 벡터 그래픽을 직접 생성할 수 있습니다. 즐거운 코딩 되세요! + + +## 다음에 배울 내용은 무엇인가요? + + +다음 튜토리얼들은 이 가이드에서 시연한 기술을 기반으로 하여 밀접하게 관련된 주제를 다룹니다. 각 리소스는 완전한 코드 예제와 단계별 설명을 제공하므로, 추가 API 기능을 마스터하고 프로젝트에 다양한 구현 방식을 적용하는 데 도움이 됩니다. + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/korean/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..962623bb4e --- /dev/null +++ b/html/korean/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,238 @@ +--- +category: general +date: 2026-10-02 +description: HtmlSaveOptions와 스트리밍을 사용하여 Python에서 HTML 문서를 로드하고 대용량 HTML 파일을 효율적으로 + 처리하는 방법을 배워보세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: ko +lastmod: 2026-10-02 +og_description: HtmlSaveOptions와 스트리밍을 사용하여 Python에서 HTML 문서를 로드합니다. 이 튜토리얼은 대용량 HTML + 파일을 위한 완전하고 바로 실행 가능한 솔루션을 보여줍니다. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Python에서 스트리밍으로 HTML 문서 로드하기 – 단계별 가이드 +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Python에서 스트리밍으로 HTML 문서를 로드하는 방법 +url: /ko/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python에서 스트리밍으로 HTML 문서 로드하기 + +수백 메가바이트 이상 크기의 **HTML 문서** 파일을 **로드**해야 할 경우, 메모리 사용량 문제가 빠르게 발생합니다. 이 가이드는 **HTML 스트리밍**을 사용하여 메모리 사용량을 최소화하면서도 문서 내용에 완전하게 접근할 수 있는 완전한 실행 가능한 솔루션을 제공합니다. + +`HtmlSaveOptions` 설정, 스트리밍 활성화, 파일 저장까지 세 단계만으로 진행됩니다. 표준 `aspose.html` Python 패키지만 있으면 되므로, 배치 작업, 서버‑사이드 파이프라인, 혹은 **대용량 HTML 파일**을 다루는 로컬 스크립트에 이상적입니다. + +## 사전 요구 사항 + +시작하기 전에 다음이 준비되어 있는지 확인하세요: + +* Python 3.8 이상이 설치되어 있어야 합니다. +* `aspose.html` 라이브러리 (`pip install aspose-html`) – `HTMLDocument`와 `HtmlSaveOptions`를 제공합니다. +* 처리하려는 대용량 HTML 파일이 들어 있는 디렉터리 (예: `large.html`). + +요구 사항이 최소이므로, 효율적인 HTML 문서 로드 핵심 로직에 집중할 수 있습니다. + +## 1단계: HTML 문서 로드 + +첫 번째 작업은 소스 파일을 가리키는 `HTMLDocument` 인스턴스를 만드는 것입니다. 이 객체는 **load html document** 작업을 나타내며, 마크업을 지연 파싱(lazy parsing)하여 대용량 파일을 처리하는 데 필수적입니다. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**왜 중요한가:** +`HTMLDocument` 객체를 생성해도 파일 전체를 즉시 메모리로 읽어들이지는 않습니다. 대신 필요에 따라 디스크에서 데이터를 끌어오는 스트리밍 파서가 준비됩니다. 이 설계 덕분에 머신의 RAM을 초과하는 파일도 다룰 수 있습니다. + +## 2단계: HtmlSaveOptions 로 스트리밍 활성화 + +문서를 조작하거나 저장할 때 메모리 사용량을 낮게 유지하려면 `HtmlSaveOptions`에서 스트리밍 모드를 활성화해야 합니다. 이 보조 키워드 **HtmlSaveOptions**는 라이브러리가 출력 파일을 쓰는 방식을 제어합니다. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**스트리밍을 활성화하는 이유:** +`enable_streaming`을 `True`로 설정하면 라이브러리가 전체 결과를 메모리에 버퍼링하지 않고 청크 단위로 출력합니다. 이는 이후 **save the document** 혹은 **large HTML files**에 대한 변환 작업을 수행할 때 필수적입니다. + +## 3단계: 구성된 옵션으로 문서 저장 + +스트리밍이 활성화되었으니 이제 처리된 내용을 새 파일에 안전하게 기록할 수 있습니다. `save` 메서드는 우리가 설정한 `HtmlSaveOptions`를 따르며, 메모리 효율적인 작업을 보장합니다. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**내부에서 일어나는 일:** +`save` 호출은 HTML 마크업을 `large_out.html` 로 한 조각씩 스트리밍합니다. 문서가 스트리밍 파서로 로드되었기 때문에, 로드부터 저장까지 전체 파이프라인이 일정하고 낮은 메모리 사용량으로 동작합니다. + +## 전체 작동 예제 + +세 단계를 하나로 합치면 명령줄에서 바로 실행할 수 있는 간결한 스크립트가 됩니다: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**예상 출력** + +스크립트를 실행하면 (`python load_html_document_streaming.py`), 다음과 같은 출력이 표시됩니다: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` 파일은 원본과 동일한 복사본이지만, 전체 파일을 RAM에 로드하지 않고 처리되었습니다. + +## 자주 묻는 질문 및 엣지 케이스 처리 + +### 외부 리소스(이미지, CSS, 스크립트)를 포함한 HTML 파일에서도 작동하나요? + +예. 스트리밍 파서는 외부 참조를 일반 속성으로 취급합니다. 별도로 요청하지 않는 한 리소스를 다운로드하지 **않습니다**. 리소스를 포함시켜야 한다면, 문서 로드 후 `aspose.html`의 추가 API를 사용할 수 있습니다. + +### 소스 파일이 손상되었거나 올바른 HTML 형식이 아닐 경우는 어떻게 하나요? + +`HTMLDocument`는 사소한 오류를 복구하려 시도하지만, 심각한 구조 오류는 예외를 발생시킵니다. 로드 단계에 `try/except` 블록을 추가해 이러한 상황을 우아하게 처리하세요: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### 저장하기 전에 DOM을 수정할 수 있나요? + +물론 가능합니다. 로드 후에는 `html_doc.dom`을 통해 DOM 트리에 완전하게 접근할 수 있습니다. 노드를 삽입하거나 요소를 제거하고 속성을 변경한 뒤, 스트리밍이 계속 활성화된 상태에서 `save`를 호출하면 메모리 사용량은 낮게 유지됩니다. + +### 스트리밍이 출력 품질에 영향을 미치나요? + +아니요. 스트리밍된 출력은 DOM을 수정하지 않은 경우, 비스트리밍 저장과 바이트‑단위로 동일합니다. 스트리밍은 **데이터가 쓰이는 방식**만 바꾸고, **쓰여지는 내용**은 바꾸지 않습니다. + +## 성능 팁: 메모리 사용량 측정 + +스트리밍이 실제로 메모리 사용량을 줄이는지 확인하려면 `psutil` 라이브러리를 사용할 수 있습니다: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +500 MB 규모의 HTML 파일이라도 보통 몇 메가바이트 수준의 RAM만 사용됩니다. + +## 결론 + +이 튜토리얼에서는 Python에서 **load html document** 를 효율적으로 수행하는 방법을 배웠습니다: + +1. `HTMLDocument`를 인스턴스화해 파일을 지연 파싱합니다. +2. `HtmlSaveOptions`에 `enable_streaming = True` 를 설정해 저메모리 쓰기를 구성합니다. +3. 스트리밍된 출력을 디스크에 저장합니다. + +이 세 단계는 **large HTML files** 를 **Python HTML processing** 기술로 처리하기 위한 견고한 패턴을 제공합니다. 이제 스크립트를 확장해 DOM을 수정하거나 데이터를 추출하고, 수십 개의 파일을 배치 처리하면서도 메모리 사용량을 예측 가능하게 유지할 수 있습니다. + +**다음 단계** + +* `aspose.html` DOM API를 탐색해 표, 링크, 이미지 등을 추출해 보세요. +* 이 접근 방식을 멀티스레딩과 결합해 여러 파일을 병렬 처리해 보세요. +* 문자 인코딩이나 기타 파싱 세부 사항을 제어해야 한다면 `HtmlLoadOptions` 를 살펴보세요. + +코딩을 즐기시고, 대규모 **load html document** 를 메모리 친화적으로 처리하는 방법을 마음껏 활용하세요! + +## 다음에 배워야 할 내용은? + +다음 튜토리얼들은 이 가이드에서 다룬 기술을 기반으로 하며, 추가 API 기능을 마스터하고 프로젝트에 다양한 구현 방식을 적용할 수 있도록 단계별 예제 코드를 제공합니다. + +- [HTML 문서 Java 로드 – XPath & CSS 완전 가이드](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [URL을 사용한 .NET HTML 로드 – Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Aspose HTML에서 JavaScript 활성화 – HTML 로드 및 텍스트 가져오기](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/polish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..f5253ba754 --- /dev/null +++ b/html/polish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: Konwertuj HTML na Markdown w Pythonie z pełnym przykładem. Dowiedz się, + jak zapisać HTML jako Markdown, wybrać formatery i włączyć określone funkcje. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: pl +lastmod: 2026-10-02 +og_description: Konwertuj HTML na Markdown w Pythonie przy użyciu praktycznego kodu, + opcji formatowania i flag funkcji. Skorzystaj z tego przewodnika, aby szybko zapisać + HTML jako Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Konwertuj HTML na Markdown w Pythonie – pełny poradnik +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Jak przekonwertować HTML na Markdown w Pythonie – przewodnik krok po kroku +url: /pl/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak konwertować HTML na Markdown w Pythonie – przewodnik krok po kroku + +Jeśli potrzebujesz **konwertować HTML na Markdown**, ten przewodnik pokaże Ci kompletną, gotową do uruchomienia w Pythonie rozwiązanie. Zobaczysz, jak **zapisać HTML jako Markdown**, wybrać odpowiedni formatter i włączyć tylko te funkcje, które są dla Ciebie istotne. + +Konwersja HTML na Markdown to powszechne zadanie, gdy potrzebujesz lekkiej dokumentacji, treści statycznej witryny lub plików tekstowych kontrolowanych wersjami. Ten tutorial obejmuje wszystko, od instalacji biblioteki po obsługę przypadków brzegowych, abyś mógł zastosować technikę do dowolnego źródła HTML. + +## Wymagania wstępne + +Zanim zaczniesz, upewnij się, że masz: + +* Python 3.8 lub nowszy zainstalowany. +* Dostęp do `pip`, aby instalować pakiety zewnętrzne. +* Podstawową znajomość znaczników HTML i składni Markdown. + +Nie są wymagane dodatkowe zależności systemowe, ponieważ biblioteka konwersji jest czystym Pythonem. + +## Zainstaluj bibliotekę GroupDocs Conversion + +Przykład kodu używa pakietu Pythona **GroupDocs.Conversion**, który udostępnia `HTMLDocument`, `MarkdownSaveOptions` oraz `Converter`. Zainstaluj go za pomocą: + +```bash +pip install groupdocs-conversion +``` + +> **Wskazówka:** Użyj wirtualnego środowiska (`python -m venv venv`), aby utrzymać pakiet odizolowany od innych projektów. + +## Krok 1: Utwórz `HTMLDocument` z łańcucha znaków + +Pierwszym krokiem jest opakowanie surowego HTML w instancję `HTMLDocument`. Ten obiekt abstrahuje źródło, niezależnie od tego, czy pochodzi ono z łańcucha znaków, pliku czy zdalnego URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Dlaczego to ważne:* `HTMLDocument` parsuje znacznik raz, umożliwiając konwerterowi pracę z znormalizowaną reprezentacją zamiast surowego tekstu. + +## Krok 2: Skonfiguruj `MarkdownSaveOptions` + +`MarkdownSaveOptions` pozwala kontrolować format wyjściowy i które funkcje Markdown są generowane. Biblioteka obsługuje dwa formatery: + +* **DEFAULT** – standardowy Markdown zgodny z CommonMark. +* **GIT** – Markdown w stylu Git (dodaje tabele, przekreślenia itp.). + +W większości scenariuszy kontroli wersji preferowany jest formatter **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Włączanie tylko potrzebnych funkcji + +Możesz precyzyjnie dostroić wyjście, włączając konkretne flagi funkcji. W tym przykładzie zachowujemy **linki** i **akapity**, wyłączając obrazy, tabele i inne konstrukcje. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Dlaczego to ważne:* Ograniczenie funkcji zmniejsza rozmiar wygenerowanego pliku i zapobiega nieoczekiwanym elementom Markdown, które mogą nie być obsługiwane przez narzędzia downstream. + +## Krok 3: Konwertuj dokument + +Mając źródłowy `HTMLDocument` i skonfigurowane `MarkdownSaveOptions`, konwersja odbywa się jednym wywołaniem `Converter.convert`. Podaj absolutną lub względną ścieżkę do pliku wyjściowego. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Po zakończeniu wywołania, `output.md` zawiera reprezentację Markdown oryginalnego HTML. + +## Pełny skrypt, który możesz uruchomić już dziś + +Poniżej znajduje się kompletny, samodzielny skrypt, który zawiera wszystkie poprzednie kroki. Zapisz go jako `html_to_md.py` i uruchom `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Oczekiwany wynik (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Wynik odzwierciedla pierwotną strukturę HTML, jednocześnie eksponując tylko włączone przez nas funkcje (linki, akapity i listy). + +## Obsługa typowych przypadków brzegowych + +### Brakujące lub nieprawidłowe atrybuty `href` + +Jeśli znacznik `` nie ma prawidłowego `href`, konwerter wstawia tekst linku bez URL. Aby zachować czytelność, możesz poddać Markdown post‑procesowaniu: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Konwersja dużych plików HTML + +W przypadku wielomegabajtowych plików HTML, strumieniuj wejście, aby uniknąć ładowania całego markupu do pamięci: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Sam proces konwersji pozostaje niezmieniony, ponieważ `HTMLDocument` abstrahuje rozmiar źródła. + +## Alternatywne formatery + +Jeśli wolisz czysty CommonMark zamiast wyjścia w stylu Git, zmień formatter: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Daje to bardziej minimalistyczny plik Markdown, przydatny, gdy celujesz w platformy nieobsługujące rozszerzeń Git. + +## Powiązane zadania, które możesz rozważyć dalej + +* **Convert Markdown back to HTML** – przydatne do podglądu dokumentacji. +* **Export HTML to PDF** – kolejny powszechny przepływ pracy powiązany z **html to markdown conversion**. +* **Batch process a folder of HTML files** – iteruj po plikach i ponownie używaj tej samej instancji `MarkdownSaveOptions`. + +Wszystkie te zadania stosują ten sam schemat: utwórz dokument źródłowy, skonfiguruj opcje zapisu i wywołaj `Converter.convert`. + +## Zakończenie + +Teraz wiesz, jak **konwertować HTML na Markdown** w Pythonie, jak **zapisać HTML jako Markdown** z precyzyjną kontrolą funkcji oraz dlaczego wybór odpowiedniego formattera ma znaczenie dla narzędzi downstream. Przykład pokazuje czyste, wielokrotnego użytku podejście, które działa dla pojedynczych łańcuchów, plików lub URL‑ów i zawiera wskazówki dotyczące obsługi brakujących linków oraz dużych wejść. + +Śmiało eksperymentuj z dodatkowymi `MarkdownSaveOptions.Features` (np. `IMAGE`, `TABLE`), aby dostosować wyjście do potrzeb Twojego projektu. Jeśli ten przewodnik okazał się pomocny, podziel się nim z zespołem lub zamieść link w dokumentacji projektu. Szczęśliwe konwertowanie! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/polish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..b3864f0943 --- /dev/null +++ b/html/polish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Dowiedz się, jak stworzyć dokument SVG w Pythonie, zapisać SVG do pliku + i wyeksportować obraz SVG przy użyciu krótkiego, kompletnego skryptu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: pl +lastmod: 2026-10-02 +og_description: Utwórz dokument SVG w Pythonie i wyeksportuj obraz SVG dzięki temu + praktycznemu tutorialowi. Postępuj zgodnie ze skryptem, zapisz SVG do pliku i natychmiast + wykorzystaj grafikę wektorową. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Tworzenie dokumentu SVG w Pythonie – przewodnik krok po kroku +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Jak stworzyć dokument SVG i wyeksportować go jako obraz w Pythonie +url: /pl/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak utworzyć dokument SVG i wyeksportować go jako obraz w Pythonie + +Jeśli potrzebujesz **utworzyć dokument SVG** programowo, ten tutorial pokaże Ci dokładnie, jak to zrobić w Pythonie. Zobaczysz kompletny skrypt, który buduje prosty okrąg, zapisuje SVG do pliku i tworzy wyeksportowany obraz SVG, który możesz osadzić gdziekolwiek. + +Generowanie skalowalnych grafik wektorowych z kodu eliminuje ręczną pracę polegającą na rysowaniu kształtów w edytorze graficznym. Po zakończeniu tego przewodnika będziesz mógł zintegrować tworzenie SVG z pipeline’ami wizualizacji danych, automatycznymi generatorami raportów lub dowolnym projektem wymagającym wyraźnych, niezależnych od rozdzielczości grafik. + +## Wymagania wstępne + +Zanim zaczniesz, upewnij się, że masz: + +- Python 3.8 lub nowszy zainstalowany +- Bibliotekę `svgwrite` (instalacja za pomocą `pip install svgwrite`) +- Uprawnienia do zapisu w katalogu, w którym zostanie zapisany plik SVG + +Te wymagania utrzymują przykład lekki i kompatybilny z większością środowisk. + +## Krok 1: Zainstaluj i zaimportuj bibliotekę SVG + +Pierwszym krokiem jest dodanie zewnętrznej biblioteki, która udostępnia wygodne API do tworzenia SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrahuje strukturę XML pliku SVG, pozwalając skupić się na geometrii zamiast na surowym markup’u. + +## Krok 2: Utwórz obiekt dokumentu SVG + +Teraz możesz **utworzyć dokument SVG** poprzez zainicjowanie `svgwrite.Drawing`. Ten obiekt reprezentuje element root `` i przechowuje wszystkie kolejne kształty. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Argument `size` definiuje renderowane wymiary w pikselach, natomiast `viewBox` ustawia system współrzędnych odpowiadający geometrii, którą zdefiniujesz później. + +## Krok 3: Dodaj element okręgu + +Okrąg definiowany jest przez swój środek (`cx`, `cy`) oraz promień (`r`). Użyj pomocnika `circle`, aby dodać te atrybuty. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Okrąg znajduje się w środku płótna 100 × 100, pozostawiając 10‑pikselowy margines po każdej stronie. Dostosuj `fill` i `stroke`, aby pasowały do Twojego języka projektowego. + +## Krok 4: Zapisz SVG do pliku + +Po złożeniu grafiki możesz **zapisz SVG do pliku** używając metody `save`. To zapisuje poprawny XML, który rozumieją przeglądarki i edytory wektorowe. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Plik `circle.svg` znajduje się teraz w bieżącym katalogu roboczym. Możesz otworzyć go w przeglądarce internetowej, Inkscape lub dowolnym narzędziu obsługującym format SVG. + +## Krok 5: Zweryfikuj wyeksportowany obraz SVG + +Otwórz zapisany plik w przeglądarce, aby potwierdzić wynik. Powinieneś zobaczyć wyśrodkowany okrąg w określonych kolorach. Surowy XML wygląda tak: + +```xml + + + + +``` + +Ponieważ SVG jest oparty na wektorach, możesz skalować obraz bez utraty jakości, co czyni go idealnym dla responsywnych projektów internetowych lub druku wysokiej rozdzielczości. + +## Porada: Eksportuj SVG jako PNG lub JPEG + +Jeśli potrzebujesz wersji rastrowej, połącz plik SVG z narzędziem konwersji, takim jak **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Ten krok demonstruje **eksport obrazu SVG** do formatu bitmapowego, przydatny, gdy systemy downstream nie potrafią renderować SVG bezpośrednio. + +## Typowe wariacje i przypadki brzegowe + +| Wariant | Jak postępować | +|-----------|---------------| +| Wiele kształtów | Wywołaj `dwg.add()` dla każdego nowego elementu (rect, line, path). | +| Dynamiczne wymiary | Oblicz `size` i `viewBox` na podstawie danych przed utworzeniem `Drawing`. | +| Etykiety tekstowe | Użyj `dwg.text("Label", insert=("10", "20"))` i stylizuj przy pomocy `font_size` oraz `fill`. | +| Ponowne użycie dokumentu | Przechowuj obiekt `Drawing` w pamięci i wywołuj `save()` za każdym razem, gdy potrzebny jest zaktualizowany plik. | +| Duże pliki | Strumieniuj wyjście używając `dwg.tostring()` i ręcznie zapisuj do obiektu pliku, aby uniknąć skoków pamięci. | + +Rozważanie tych scenariuszy zapewnia, że Twój **skrypt generujący SVG** skaluje się od prostych ikon po złożone diagramy. + +## Pełny przegląd skryptu + +Poniżej znajduje się kompletny, gotowy do uruchomienia przykład, który obejmuje wszystkie kroki oraz opcjonalną konwersję: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Uruchomienie tego skryptu tworzy `circle.svg` oraz, jeśli zainstalowany jest `cairosvg`, `circle.png`. Oba pliki są gotowe do włączenia w strony internetowe, raporty lub dalsze przetwarzanie. + +## Zakończenie + +Teraz wiesz, jak **utworzyć dokument SVG** w Pythonie, **zapisz SVG do pliku** i **wyeksportować obraz SVG** do szerszego użytku. Przykład obejmuje niezbędne wywołania API, wyjaśnia dlaczego każdy krok ma znaczenie i oferuje rozszerzenia dla bardziej złożonych grafik. + +Następnie, odkryj dodatkowe tematy **tutoriali SVG w Pythonie**, takie jak rysowanie ścieżek, stosowanie gradientów i animowanie elementów. Integracja tych technik pozwoli Ci generować dynamiczne, oparte na danych grafiki wektorowe bezpośrednio z aplikacji Python. Powodzenia w kodowaniu! + +## Co powinieneś nauczyć się dalej? + +Poniższe tutoriale obejmują ściśle powiązane tematy, które rozwijają techniki przedstawione w tym przewodniku. Każde źródło zawiera kompletne, działające przykłady kodu oraz wyjaśnienia krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i eksplorować alternatywne podejścia implementacyjne w własnych projektach. + +- [Utwórz i zarządzaj dokumentami SVG w Aspose.HTML dla Javy](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Zapisz dokument SVG w Aspose.HTML dla Javy](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Konwertuj SVG na obraz przy użyciu Aspose.HTML dla Javy](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/polish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..023683c53d --- /dev/null +++ b/html/polish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-10-02 +description: Dowiedz się, jak wczytać dokument HTML w Pythonie przy użyciu HtmlSaveOptions + i strumieniowania, aby efektywnie przetwarzać duże pliki HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: pl +lastmod: 2026-10-02 +og_description: Wczytaj dokument HTML w Pythonie przy użyciu HtmlSaveOptions i strumieniowania. + Ten tutorial przedstawia kompletną, gotową do uruchomienia rozwiązanie dla dużych + plików HTML. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Ładowanie dokumentu HTML ze strumieniowaniem w Pythonie – przewodnik krok + po kroku +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Jak wczytać dokument HTML przy użyciu strumieniowania w Pythonie +url: /pl/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak ładować dokument html przy użyciu strumieniowania w Pythonie + +Jeśli potrzebujesz **load html document** plików, które mają kilkaset megabajtów lub więcej, szybko napotkasz problemy z zużyciem pamięci. Ten przewodnik pokazuje kompletną, gotową do uruchomienia rozwiązanie, które wykorzystuje **HTML streaming**, aby utrzymać niskie zużycie pamięci, jednocześnie dając pełny dostęp do zawartości dokumentu. + +Nauczysz się, jak skonfigurować `HtmlSaveOptions`, włączyć strumieniowanie i zapisać przetworzony plik — wszystko w zaledwie trzech zwięzłych krokach. Nie są potrzebne żadne zewnętrzne narzędzia poza standardowym pakietem Python `aspose.html`, co czyni to podejście idealnym dla zadań wsadowych, potoków po stronie serwera lub lokalnych skryptów obsługujących **large HTML files**. + +## Prerequisites + +Before you start, make sure you have: + +* Python 3.8 or newer installed. +* The `aspose.html` library (`pip install aspose-html`) – this provides `HTMLDocument` and `HtmlSaveOptions`. +* A directory that contains the large HTML file you want to work with (e.g., `large.html`). + +These requirements are minimal, so you can focus on the core logic of loading an HTML document efficiently. + +## Krok 1: Załaduj dokument HTML + +The first operation is to create an `HTMLDocument` instance that points to the source file. This object represents the **load html document** operation and parses the markup lazily, which is essential for handling big files. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Dlaczego to ważne:** +Creating the `HTMLDocument` object does not immediately read the whole file into memory. Instead, it prepares a streaming parser that will pull data from disk as needed. This design lets you work with files that exceed your machine’s RAM. + +## Krok 2: Włącz strumieniowanie przy użyciu HtmlSaveOptions + +To keep the memory footprint low while you manipulate or save the document, you must enable the streaming mode on `HtmlSaveOptions`. This secondary keyword, **HtmlSaveOptions**, controls how the library writes the output file. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Dlaczego włączyć strumieniowanie?** +When `enable_streaming` is set to `True`, the library writes the output in chunks rather than buffering the entire result in memory. This is crucial when you later **save the document** or perform transformations on **large HTML files**. + +## Krok 3: Zapisz dokument z skonfigurowanymi opcjami + +Now that streaming is active, you can safely write the processed content to a new file. The `save` method respects the `HtmlSaveOptions` we configured, ensuring that the operation stays memory‑efficient. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Co dzieje się w tle:** +The `save` call streams the HTML markup to `large_out.html` piece by piece. Because the document was loaded with the streaming parser, the entire pipeline—from load to save—operates with a constant, low memory usage. + +## Pełny działający przykład + +Putting the three steps together gives you a compact script you can run directly from the command line: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Oczekiwany wynik** + +When you run the script (`python load_html_document_streaming.py`), you should see: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +The `large_out.html` file will be a faithful copy of the original, but it was processed without ever loading the entire file into RAM. + +## Common questions and edge‑case handling + +### Czy to działa z plikami HTML zawierającymi zasoby zewnętrzne (obrazy, CSS, skrypty)? + +Yes. The streaming parser treats external references as ordinary attributes. It does **not** download the resources unless you explicitly request them. If you need to embed those resources, you can use additional APIs from `aspose.html` after the document is loaded. + +### Co jeśli plik źródłowy jest uszkodzony lub niepoprawny HTML? + +`HTMLDocument` will attempt to recover from minor errors, but severe malformations raise an exception. Wrap the load step in a `try/except` block to handle such cases gracefully: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Czy mogę modyfikować DOM przed zapisem? + +Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). You can insert nodes, remove elements, or alter attributes, and then call `save` with streaming still enabled. The memory usage will stay low because changes are applied incrementally. + +### Czy strumieniowanie wpływa na jakość wyjścia? + +No. The streamed output is byte‑for‑byte identical to what you would get from a non‑streaming save, assuming you haven’t made any DOM modifications. Streaming only changes how the data is written, not what is written. + +## Performance tip: measure memory usage + +If you want to verify that streaming really reduces memory consumption, you can use the `psutil` library: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +You’ll typically see only a few megabytes of RAM used, even for 500 MB HTML files. + +## Conclusion + +In this tutorial you learned how to **load html document** efficiently in Python by: + +1. Instantiating `HTMLDocument` to parse the file lazily. +2. Configuring `HtmlSaveOptions` with `enable_streaming = True` for low‑memory writes. +3. Saving the document while streaming the output to disk. + +These three steps give you a robust pattern for processing **large HTML files** using **Python HTML processing** techniques. From here you can extend the script to modify the DOM, extract data, or batch‑process dozens of files—all while keeping memory usage predictable. + +**Kolejne kroki** + +* Explore the `aspose.html` DOM API to extract tables, links, or images. +* Combine this approach with multithreading to process multiple files in parallel. +* Look into `HtmlLoadOptions` if you need to control character encoding or other parsing nuances. + +Happy coding, and enjoy the memory‑friendly way to **load html document** at scale! + +## Co powinieneś nauczyć się dalej? + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Ładowanie dokumentu HTML w Javie – Kompletny przewodnik z XPath i CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Ładowanie HTML przy użyciu URL w .NET z Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Jak włączyć JavaScript w Aspose HTML – Ładowanie HTML i pobieranie tekstu](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/portuguese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..2a94eccce2 --- /dev/null +++ b/html/portuguese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Converta HTML para Markdown em Python com um exemplo completo. Aprenda + como salvar HTML como Markdown, escolher formatadores e habilitar recursos específicos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: pt +lastmod: 2026-10-02 +og_description: Converta HTML para Markdown em Python com código prático, opções de + formatador e flags de recursos. Siga este guia para salvar HTML como Markdown rapidamente. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Converter HTML para Markdown em Python – tutorial completo +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Como converter HTML para Markdown em Python – guia passo a passo +url: /pt/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como converter HTML para Markdown em Python – guia passo a passo + +Se você precisa **converter HTML para Markdown**, este guia mostra uma solução completa e executável em Python. Você verá como **salvar HTML como Markdown**, escolher o formatador correto e habilitar apenas os recursos que lhe interessam. + +Converter HTML para Markdown é uma tarefa comum quando se deseja documentação leve, conteúdo para sites estáticos ou arquivos de texto versionados. Este tutorial cobre tudo, desde a instalação da biblioteca até o tratamento de casos extremos, para que você possa aplicar a técnica a qualquer fonte HTML. + +## Pré‑requisitos + +Antes de começar, certifique‑se de que você tem: + +* Python 3.8 ou mais recente instalado. +* Acesso ao `pip` para instalar pacotes de terceiros. +* Familiaridade básica com tags HTML e sintaxe Markdown. + +Nenhuma dependência de sistema adicional é necessária porque a biblioteca de conversão é pura Python. + +## Instalar a biblioteca GroupDocs Conversion + +O exemplo de código usa o pacote Python **GroupDocs.Conversion**, que fornece `HTMLDocument`, `MarkdownSaveOptions` e `Converter`. Instale‑o com: + +```bash +pip install groupdocs-conversion +``` + +> **Dica profissional:** Use um ambiente virtual (`python -m venv venv`) para manter o pacote isolado de outros projetos. + +## Etapa 1: Criar um `HTMLDocument` a partir de uma string + +O primeiro passo é envolver seu HTML bruto em uma instância de `HTMLDocument`. Esse objeto abstrai a origem, seja ela uma string, um arquivo ou uma URL remota. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Por que isso importa:* `HTMLDocument` analisa a marcação uma única vez, permitindo que o conversor trabalhe com uma representação normalizada em vez de texto bruto. + +## Etapa 2: Configurar `MarkdownSaveOptions` + +`MarkdownSaveOptions` permite controlar o formato de saída e quais recursos do Markdown são emitidos. A biblioteca oferece dois formatadores: + +* **DEFAULT** – Markdown padrão compatível com CommonMark. +* **GIT** – Markdown com recursos do Git (adiciona tabelas, tachado, etc.). + +Para a maioria dos cenários de controle de versão, o formatador **GIT** é o preferido. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Habilitando apenas os recursos necessários + +Você pode ajustar a saída ativando flags de recursos específicos. Neste exemplo mantemos **links** e **parágrafos** enquanto desativamos imagens, tabelas e outras construções. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Por que isso importa:* Limitar os recursos reduz o tamanho do arquivo gerado e impede a inclusão de elementos Markdown inesperados que ferramentas subsequentes podem não suportar. + +## Etapa 3: Converter o documento + +Com o `HTMLDocument` de origem e o `MarkdownSaveOptions` configurado, a conversão é feita com uma única chamada a `Converter.convert`. Forneça um caminho absoluto ou relativo para o arquivo de saída. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Após a chamada terminar, `output.md` contém a representação Markdown do HTML original. + +## Script completo que você pode executar hoje + +Abaixo está o script completo e autocontido que incorpora todas as etapas anteriores. Salve‑o como `html_to_md.py` e execute `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Saída esperada (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +A saída corresponde à estrutura original do HTML enquanto expõe apenas os recursos que habilitamos (links, parágrafos e listas). + +## Tratamento de casos extremos comuns + +### Atributos `href` ausentes ou malformados + +Se uma tag `` não possuir um `href` válido, o conversor insere o texto do link sem URL. Para preservar a legibilidade, você pode querer pós‑processar o Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Convertendo arquivos HTML grandes + +Para arquivos HTML de vários megabytes, faça streaming da entrada para evitar carregar toda a marcação na memória: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +O processo de conversão em si permanece inalterado porque `HTMLDocument` abstrai o tamanho da fonte. + +## Formatadores alternativos + +Se você preferir CommonMark puro em vez da saída com recursos do Git, altere o formatador: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Isso gera um arquivo Markdown mais minimalista, útil quando você mira plataformas que não suportam extensões do Git. + +## Tarefas relacionadas que você pode explorar a seguir + +* **Converter Markdown de volta para HTML** – útil para pré‑visualizar documentação. +* **Exportar HTML para PDF** – outro fluxo de trabalho comum adjacente à **conversão de html para markdown**. +* **Processar em lote uma pasta de arquivos HTML** – iterar sobre arquivos e reutilizar a mesma instância de `MarkdownSaveOptions`. + +Todas essas seguem o mesmo padrão: criar um documento de origem, configurar as opções de salvamento e chamar `Converter.convert`. + +## Conclusão + +Agora você sabe como **converter HTML para Markdown** em Python, como **salvar HTML como Markdown** com controle preciso de recursos e por que selecionar o formatador correto é importante para as ferramentas subsequentes. O exemplo demonstra uma abordagem limpa e reutilizável que funciona para strings individuais, arquivos ou URLs, e inclui dicas para lidar com links ausentes e entradas grandes. + +Sinta‑se à vontade para experimentar recursos adicionais de `MarkdownSaveOptions.Features` (por exemplo, `IMAGE`, `TABLE`) para adaptar a saída às necessidades do seu projeto. Se este guia foi útil, compartilhe‑o com colegas ou vincule‑o à documentação do seu projeto. Boa conversão! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/portuguese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..263a7cd618 --- /dev/null +++ b/html/portuguese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,213 @@ +--- +category: general +date: 2026-10-02 +description: Aprenda a criar documentos SVG em Python, salvar SVG em um arquivo e + exportar a imagem SVG com um script curto e completo. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: pt +lastmod: 2026-10-02 +og_description: Crie um documento SVG em Python e exporte a imagem SVG com este tutorial + prático. Siga o script, salve o SVG em um arquivo e reutilize o gráfico vetorial + instantaneamente. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Crie um documento SVG em Python – guia passo a passo +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Como criar um documento SVG e exportá-lo como imagem em Python +url: /pt/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como criar documento SVG e exportá-lo como imagem em Python + +Se você precisar **create SVG document** programaticamente, este tutorial mostra exatamente como fazer isso com Python. Você verá um script completo que cria um círculo simples, salva o SVG em um arquivo e produz uma imagem SVG exportável que pode ser incorporada em qualquer lugar. + +Gerar gráficos vetoriais escaláveis a partir de código elimina o esforço manual de desenhar formas em um editor GUI. Ao final deste guia, você poderá integrar a criação de SVG em pipelines de visualização de dados, geradores de relatórios automatizados ou qualquer projeto que exija gráficos nítidos e independentes de resolução. + +## Pré-requisitos + +- Python 3.8 ou superior instalado +- A biblioteca `svgwrite` (instale com `pip install svgwrite`) +- Permissão de escrita no diretório onde o SVG será salvo + +Esses requisitos mantêm o exemplo leve e compatível com a maioria dos ambientes. + +## Etapa 1: Instalar e importar a biblioteca SVG + +O primeiro passo é adicionar a biblioteca de terceiros que fornece uma API conveniente para a criação de SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrai a estrutura XML de um arquivo SVG, permitindo que você se concentre na geometria em vez de marcação bruta. + +## Etapa 2: Criar um objeto de documento SVG + +Agora você pode **create SVG document** instanciando `svgwrite.Drawing`. Este objeto representa o elemento raiz `` e contém todas as formas subsequentes. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +O argumento `size` define as dimensões em pixels renderizadas, enquanto `viewBox` estabelece um sistema de coordenadas que corresponde à geometria que você definirá mais tarde. + +## Etapa 3: Adicionar um elemento círculo + +Um círculo é definido por seu centro (`cx`, `cy`) e raio (`r`). Use o helper `circle` para atribuir esses atributos. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +O círculo fica no meio da tela de 100 × 100, deixando uma margem de 10 pixels em cada lado. Ajuste `fill` e `stroke` para combinar com a linguagem de design. + +## Etapa 4: Salvar o SVG em arquivo + +Com o gráfico montado, você pode **save SVG to file** usando o método `save`. Isso grava XML bem‑formado que navegadores e editores vetoriais entendem. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +O arquivo `circle.svg` agora está no diretório de trabalho atual. Você pode abri‑lo em um navegador web, Inkscape ou qualquer ferramenta que suporte o formato SVG. + +## Etapa 5: Verificar a imagem SVG exportada + +Abra o arquivo salvo em um navegador para confirmar o resultado. Você deve ver um círculo centralizado com as cores especificadas. O XML bruto se parece com isto: + +```xml + + + + +``` + +Como o SVG é baseado em vetores, você pode escalar a imagem sem perda de qualidade, tornando‑a ideal para designs web responsivos ou impressão de alta resolução. + +## Dica profissional: Exportar SVG como PNG ou JPEG + +Se você precisar de uma versão raster, combine o arquivo SVG com uma ferramenta de conversão como **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Esta etapa demonstra **export SVG image** para um formato bitmap, útil quando sistemas downstream não podem renderizar SVG diretamente. + +## Variações comuns e casos de borda + +| Variação | Como lidar | +|-----------|---------------| +| Multiple shapes | Call `dwg.add()` for each new element (rect, line, path). | +| Dynamic dimensions | Compute `size` and `viewBox` from data before creating `Drawing`. | +| Text labels | Use `dwg.text("Label", insert=("10", "20"))` and style with `font_size` and `fill`. | +| Re‑using the document | Keep the `Drawing` object in memory and call `save()` whenever you need an updated file. | +| Large files | Stream the output using `dwg.tostring()` and write to a file object manually to avoid memory spikes. | + +Abordar esses cenários garante que seu script **how to generate SVG** escale de ícones simples a diagramas complexos. + +## Recapitulação do script completo + +Abaixo está o exemplo completo e executável que incorpora todas as etapas e a conversão opcional: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Executar este script produz `circle.svg` e, se `cairosvg` estiver instalado, `circle.png`. Ambos os arquivos estão prontos para inclusão em páginas web, relatórios ou processamento adicional. + +## Conclusão + +Agora você sabe como **create SVG document** em Python, **save SVG to file**, e **export SVG image** para uso mais amplo. O exemplo cobre as chamadas de API essenciais, explica por que cada etapa é importante e oferece extensões para gráficos mais complexos. + +Em seguida, explore tópicos adicionais do **SVG Python tutorial**, como desenhar caminhos, aplicar gradientes e animar elementos. Integrar essas técnicas permitirá que você gere gráficos vetoriais dinâmicos e orientados por dados diretamente de suas aplicações Python. Feliz codificação! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir cobrem tópicos intimamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Criar e Gerenciar Documentos SVG no Aspose.HTML para Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Salvar Documento SVG no Aspose.HTML para Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Converter SVG para Imagem com Aspose.HTML para Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/portuguese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..b720802a3f --- /dev/null +++ b/html/portuguese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,236 @@ +--- +category: general +date: 2026-10-02 +description: Aprenda como carregar documentos HTML em Python com HtmlSaveOptions e + streaming para processar arquivos HTML grandes de forma eficiente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: pt +lastmod: 2026-10-02 +og_description: Carregue documento HTML em Python usando HtmlSaveOptions e streaming. + Este tutorial mostra uma solução completa, pronta‑para‑usar para arquivos HTML grandes. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Carregue documento HTML com streaming em Python – guia passo a passo +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Como carregar documento HTML com streaming em Python +url: /pt/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como carregar documento html com streaming em Python + +Se você precisar **load html document** arquivos que têm várias centenas de megabytes ou mais, rapidamente encontrará problemas de uso de memória. Este guia mostra uma solução completa, pronta‑para‑executar que usa **HTML streaming** para manter o consumo de memória baixo enquanto ainda oferece acesso total ao conteúdo do documento. + +Você aprenderá como configurar `HtmlSaveOptions`, habilitar streaming e salvar o arquivo processado — tudo em apenas três passos concisos. Nenhuma ferramenta externa é necessária além do pacote padrão Python `aspose.html`, tornando a abordagem ideal para trabalhos em lote, pipelines do lado do servidor ou scripts locais que lidam com **large HTML files**. + +## Pré-requisitos + +* Python 3.8 ou mais recente instalado. +* A biblioteca `aspose.html` (`pip install aspose-html`) – ela fornece `HTMLDocument` e `HtmlSaveOptions`. +* Um diretório que contém o arquivo HTML grande com o qual você deseja trabalhar (por exemplo, `large.html`). + +Esses requisitos são mínimos, para que você possa focar na lógica central de carregar um documento HTML de forma eficiente. + +## Etapa 1: Carregar o documento HTML + +A primeira operação é criar uma instância `HTMLDocument` que aponta para o arquivo de origem. Este objeto representa a operação **load html document** e analisa a marcação de forma preguiçosa, o que é essencial para lidar com arquivos grandes. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Por que isso importa:** +Criar o objeto `HTMLDocument` não lê imediatamente todo o arquivo para a memória. Em vez disso, ele prepara um analisador de streaming que puxará os dados do disco conforme necessário. Esse design permite que você trabalhe com arquivos que excedem a RAM da sua máquina. + +## Etapa 2: Habilitar streaming com HtmlSaveOptions + +Para manter a pegada de memória baixa enquanto você manipula ou salva o documento, é necessário habilitar o modo de streaming em `HtmlSaveOptions`. Esta palavra‑chave secundária, **HtmlSaveOptions**, controla como a biblioteca grava o arquivo de saída. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Por que habilitar streaming?** +Quando `enable_streaming` está definido como `True`, a biblioteca grava a saída em blocos ao invés de armazenar todo o resultado na memória. Isso é crucial quando você posteriormente **save the document** ou realiza transformações em **large HTML files**. + +## Etapa 3: Salvar o documento com as opções configuradas + +Agora que o streaming está ativo, você pode gravar com segurança o conteúdo processado em um novo arquivo. O método `save` respeita o `HtmlSaveOptions` que configuramos, garantindo que a operação permaneça eficiente em memória. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**O que acontece nos bastidores:** +A chamada `save` transmite a marcação HTML para `large_out.html` pedaço por pedaço. Como o documento foi carregado com o analisador de streaming, todo o pipeline — do carregamento ao salvamento — opera com uso constante e baixo de memória. + +## Exemplo completo em funcionamento + +Juntando as três etapas, você obtém um script compacto que pode ser executado diretamente na linha de comando: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Saída esperada** + +Ao executar o script (`python load_html_document_streaming.py`), você deverá ver: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +O arquivo `large_out.html` será uma cópia fiel do original, mas foi processado sem jamais carregar todo o arquivo na RAM. + +## Perguntas comuns e tratamento de casos extremos + +### Isso funciona com arquivos HTML que contêm recursos externos (imagens, CSS, scripts)? + +Sim. O analisador de streaming trata referências externas como atributos comuns. Ele **não** baixa os recursos a menos que você os solicite explicitamente. Se precisar incorporar esses recursos, pode usar APIs adicionais de `aspose.html` após o documento ser carregado. + +### E se o arquivo de origem estiver corrompido ou não for HTML bem‑formado? + +`HTMLDocument` tentará recuperar de erros menores, mas malformações graves levantam uma exceção. Envolva a etapa de carregamento em um bloco `try/except` para lidar com esses casos de forma elegante: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Posso modificar o DOM antes de salvar? + +Absolutamente. Após o carregamento, você tem acesso total à árvore DOM (`html_doc.dom`). Você pode inserir nós, remover elementos ou alterar atributos, e então chamar `save` com o streaming ainda habilitado. O uso de memória permanecerá baixo porque as alterações são aplicadas incrementalmente. + +### O streaming afeta a qualidade da saída? + +Não. A saída em streaming é byte‑a‑byte idêntica ao que você obteria de um salvamento sem streaming, assumindo que você não fez modificações no DOM. O streaming apenas altera como os dados são gravados, não o que é gravado. + +## Dica de desempenho: medir uso de memória + +Se você quiser verificar que o streaming realmente reduz o consumo de memória, pode usar a biblioteca `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Normalmente você verá apenas alguns megabytes de RAM usados, mesmo para arquivos HTML de 500 MB. + +## Conclusão + +Neste tutorial você aprendeu como **load html document** de forma eficiente em Python ao: + +1. Instanciar `HTMLDocument` para analisar o arquivo de forma preguiçosa. +2. Configurar `HtmlSaveOptions` com `enable_streaming = True` para gravações de baixa memória. +3. Salvar o documento enquanto transmite a saída para o disco. + +Essas três etapas fornecem um padrão robusto para processar **large HTML files** usando técnicas de **Python HTML processing**. A partir daqui você pode estender o script para modificar o DOM, extrair dados ou processar em lote dezenas de arquivos — tudo mantendo o uso de memória previsível. + +**Próximos passos** + +* Explore a API DOM do `aspose.html` para extrair tabelas, links ou imagens. +* Combine esta abordagem com multithreading para processar vários arquivos em paralelo. +* Investigue `HtmlLoadOptions` se precisar controlar a codificação de caracteres ou outras nuances de análise. + +Feliz codificação, e aproveite a forma amiga da memória de **load html document** em escala! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir cobrem tópicos intimamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/russian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..8adb5a4f9d --- /dev/null +++ b/html/russian/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: Конвертировать HTML в Markdown в Python с полным примером. Узнайте, как + сохранять HTML в Markdown, выбирать форматтеры и включать конкретные функции. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: ru +lastmod: 2026-10-02 +og_description: Преобразуйте HTML в Markdown на Python с практическим кодом, параметрами + форматтера и флагами функций. Следуйте этому руководству, чтобы быстро сохранить + HTML в виде Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Конвертировать HTML в Markdown в Python – полный учебник +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Как преобразовать HTML в Markdown в Python – пошаговое руководство +url: /ru/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как конвертировать HTML в Markdown в Python – пошаговое руководство + +Если вам нужно **конвертировать HTML в Markdown**, это руководство покажет полное, готовое к запуску решение на Python. Вы увидите, как **сохранить HTML как Markdown**, выбрать правильный форматтер и включить только те функции, которые вам нужны. + +Конвертация HTML в Markdown — распространённая задача, когда требуется лёгкая документация, контент для статических сайтов или текстовые файлы под версионный контроль. Этот туториал охватывает всё: от установки библиотеки до обработки крайних случаев, чтобы вы могли применять технику к любому HTML‑источнику. + +## Требования + +Прежде чем начать, убедитесь, что у вас есть: + +* Python 3.8 или новее. +* Доступ к `pip` для установки сторонних пакетов. +* Базовое знакомство с HTML‑тегами и синтаксисом Markdown. + +Дополнительные системные зависимости не требуются, так как библиотека конвертации написана полностью на Python. + +## Установите библиотеку GroupDocs Conversion + +В примере кода используется пакет **GroupDocs.Conversion** для Python, который предоставляет `HTMLDocument`, `MarkdownSaveOptions` и `Converter`. Установите его командой: + +```bash +pip install groupdocs-conversion +``` + +> **Совет:** Используйте виртуальное окружение (`python -m venv venv`), чтобы изолировать пакет от других проектов. + +## Шаг 1: Создайте `HTMLDocument` из строки + +Первый шаг — обернуть ваш сырой HTML в экземпляр `HTMLDocument`. Этот объект абстрагирует источник, будь то строка, файл или удалённый URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Почему это важно:* `HTMLDocument` парсит разметку один раз, позволяя конвертеру работать с нормализованным представлением вместо сырого текста. + +## Шаг 2: Настройте `MarkdownSaveOptions` + +`MarkdownSaveOptions` позволяет управлять форматом вывода и тем, какие функции Markdown будут сгенерированы. Библиотека поддерживает два форматтера: + +* **DEFAULT** – стандартный CommonMark‑совместимый Markdown. +* **GIT** – Git‑flavored Markdown (добавляет таблицы, зачёркивание и т.д.). + +Для большинства сценариев с контролем версий предпочтительнее форматтер **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Включение только нужных функций + +Можно тонко настроить вывод, включив конкретные флаги функций. В этом примере мы оставляем **links** и **paragraphs**, отключая изображения, таблицы и другие конструкции. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Почему это важно:* Ограничение функций уменьшает размер генерируемого файла и предотвращает появление неожиданных элементов Markdown, которые могут не поддерживаться downstream‑инструментами. + +## Шаг 3: Конвертируйте документ + +Имея исходный `HTMLDocument` и настроенный `MarkdownSaveOptions`, конвертация выполняется одним вызовом `Converter.convert`. Укажите абсолютный или относительный путь к файлу вывода. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +После завершения вызова файл `output.md` будет содержать Markdown‑представление исходного HTML. + +## Полный скрипт, который можно запустить сегодня + +Ниже представлен полностью автономный скрипт, включающий все предыдущие шаги. Сохраните его как `html_to_md.py` и запустите `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Ожидаемый вывод (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Вывод сохраняет структуру исходного HTML, при этом включены только те функции, которые мы активировали (ссылки, абзацы и списки). + +## Обработка распространённых крайних случаев + +### Отсутствующие или некорректные атрибуты `href` + +Если в теге `` нет валидного `href`, конвертер вставит только текст ссылки без URL. Чтобы сохранить читаемость, возможно, понадобится пост‑обработка Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Конвертация больших HTML‑файлов + +Для многомегабайтных HTML‑файлов рекомендуется потоково читать ввод, чтобы не загружать всю разметку в память: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Сам процесс конвертации остаётся неизменным, поскольку `HTMLDocument` абстрагирует размер источника. + +## Альтернативные форматтеры + +Если вам нужен обычный CommonMark вместо Git‑flavored вывода, переключите форматтер: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Это даст более минимальный файл Markdown, полезный, когда целевая платформа не поддерживает расширения Git. + +## Связанные задачи, которые можно исследовать дальше + +* **Конвертировать Markdown обратно в HTML** – полезно для предварительного просмотра документации. +* **Экспортировать HTML в PDF** – ещё один распространённый workflow, смежный с **html to markdown conversion**. +* **Пакетная обработка папки HTML‑файлов** – перебор файлов с повторным использованием того же экземпляра `MarkdownSaveOptions`. + +Все эти задачи следуют одной схеме: создать исходный документ, настроить параметры сохранения и вызвать `Converter.convert`. + +## Заключение + +Теперь вы знаете, как **конвертировать HTML в Markdown** на Python, как **сохранить HTML как Markdown** с точным контролем функций и почему выбор правильного форматтера важен для downstream‑инструментов. Пример демонстрирует чистый, переиспользуемый подход, работающий со строками, файлами и URL, а также содержит советы по обработке отсутствующих ссылок и больших входных данных. + +Не стесняйтесь экспериментировать с дополнительными `MarkdownSaveOptions.Features` (например, `IMAGE`, `TABLE`), чтобы адаптировать вывод под нужды вашего проекта. Если этот гид оказался полезным, поделитесь им с коллегами или добавьте ссылку в документацию проекта. Приятной конвертации! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/russian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..8457fa1f02 --- /dev/null +++ b/html/russian/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Узнайте, как создать SVG‑документ в Python, сохранить SVG в файл и экспортировать + SVG‑изображение с помощью короткого полного скрипта. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: ru +lastmod: 2026-10-02 +og_description: Создайте SVG‑документ на Python и экспортируйте SVG‑изображение с + помощью этого практического руководства. Следуйте скрипту, сохраните SVG в файл + и сразу используйте векторную графику. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Создание SVG‑документа в Python — пошаговое руководство +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Как создать SVG‑документ и экспортировать его как изображение в Python +url: /ru/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как создать SVG‑документ и экспортировать его как изображение в Python + +Если вам нужно **создать SVG‑документ** программно, этот учебник покажет, как это сделать с помощью Python. Вы увидите полный скрипт, который рисует простой круг, сохраняет SVG в файл и генерирует экспортируемое SVG‑изображение, которое можно вставлять куда угодно. + +Генерация масштабируемой векторной графики из кода избавляет от ручного рисования фигур в графическом редакторе. К концу руководства вы сможете интегрировать создание SVG в конвейеры визуализации данных, автоматические генераторы отчетов или любой проект, требующий четкой графики без зависимости от разрешения. + +## Требования + +Прежде чем начать, убедитесь, что у вас есть: + +- Python 3.8 или новее +- Библиотека `svgwrite` (устанавливается командой `pip install svgwrite`) +- Права на запись в каталог, где будет сохраняться SVG + +Эти требования делают пример лёгким и совместимым с большинством окружений. + +## Шаг 1: Установите и импортируйте библиотеку SVG + +Первый шаг — добавить стороннюю библиотеку, предоставляющую удобный API для создания SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` абстрагирует XML‑структуру SVG‑файла, позволяя сосредоточиться на геометрии, а не на разметке. + +## Шаг 2: Создайте объект SVG‑документа + +Теперь вы можете **создать SVG‑документ**, создав экземпляр `svgwrite.Drawing`. Этот объект представляет корневой элемент `` и содержит все последующие фигуры. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Аргумент `size` задаёт размеры в пикселях, а `viewBox` определяет систему координат, соответствующую будущей геометрии. + +## Шаг 3: Добавьте элемент круга + +Круг определяется центром (`cx`, `cy`) и радиусом (`r`). Используйте вспомогательный метод `circle`, чтобы задать эти атрибуты. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Круг расположен в центре канвы 100 × 100, оставляя по 10 пикселей отступа со всех сторон. Настройте `fill` и `stroke` под ваш дизайн. + +## Шаг 4: Сохраните SVG в файл + +После того как графика собрана, вы можете **сохранить SVG в файл** с помощью метода `save`. Это записывает корректный XML, который понимают браузеры и векторные редакторы. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Файл `circle.svg` теперь находится в текущем рабочем каталоге. Его можно открыть в веб‑браузере, Inkscape или любом другом инструменте, поддерживающем SVG. + +## Шаг 5: Проверьте экспортированное SVG‑изображение + +Откройте сохранённый файл в браузере, чтобы убедиться в правильности вывода. Вы должны увидеть центрированный круг с указанными цветами. Исходный XML выглядит так: + +```xml + + + + +``` + +Поскольку SVG основан на векторах, изображение можно масштабировать без потери качества, что делает его идеальным для адаптивного веб‑дизайна или печати в высоком разрешении. + +## Совет: экспортировать SVG в PNG или JPEG + +Если нужен растровый вариант, комбинируйте SVG‑файл с инструментом конвертации, например **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Этот шаг демонстрирует **экспорт SVG‑изображения** в растровый формат, полезный, когда downstream‑системы не могут напрямую рендерить SVG. + +## Общие варианты и граничные случаи + +| Вариация | Как обработать | +|-----------|----------------| +| Несколько фигур | Вызывайте `dwg.add()` для каждого нового элемента (rect, line, path). | +| Динамические размеры | Вычисляйте `size` и `viewBox` из данных перед созданием `Drawing`. | +| Текстовые подписи | Используйте `dwg.text("Label", insert=("10", "20"))` и задавайте стиль через `font_size` и `fill`. | +| Повторное использование документа | Храните объект `Drawing` в памяти и вызывайте `save()` каждый раз, когда нужен обновлённый файл. | +| Большие файлы | Потоково выводите данные через `dwg.tostring()` и записывайте в файловый объект вручную, чтобы избежать всплесков памяти. | + +Учёт этих сценариев гарантирует, что ваш **скрипт генерации SVG** масштабируется от простых иконок до сложных диаграмм. + +## Полный перечень скрипта + +Ниже приведён полностью готовый к запуску пример, включающий все шаги и опциональное преобразование: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Запуск этого скрипта создаст `circle.svg` и, при установленном `cairosvg`, `circle.png`. Оба файла готовы к включению в веб‑страницы, отчёты или дальнейшую обработку. + +## Заключение + +Теперь вы знаете, как **создать SVG‑документ** в Python, **сохранить SVG в файл** и **экспортировать SVG‑изображение** для более широкого использования. Пример охватывает основные вызовы API, объясняет, почему каждый шаг важен, и предлагает расширения для более сложной графики. + +Далее изучайте дополнительные темы **SVG‑учебника для Python**, такие как рисование путей, применение градиентов и анимация элементов. Интеграция этих техник позволит генерировать динамические, основанные на данных векторные графики напрямую из ваших Python‑приложений. Приятного кодинга! + +## Что изучать дальше? + +Следующие учебники охватывают близко связанные темы, расширяющие техники, продемонстрированные в этом руководстве. Каждый ресурс содержит полностью рабочие примеры кода с пошаговыми объяснениями, помогающими освоить дополнительные возможности API и исследовать альтернативные подходы в ваших проектах. + +- [Создание и управление SVG‑документами в Aspose.HTML для Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Сохранение SVG‑документа в Aspose.HTML для Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Конвертация SVG в изображение с помощью Aspose.HTML для Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/russian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..6821412387 --- /dev/null +++ b/html/russian/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: Узнайте, как загружать HTML‑документ в Python с помощью HtmlSaveOptions + и потоковой обработки для эффективной работы с большими HTML‑файлами. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: ru +lastmod: 2026-10-02 +og_description: Загрузите HTML‑документ в Python с помощью HtmlSaveOptions и потоковой + передачи. Этот учебник демонстрирует полное, готовое к запуску решение для больших + HTML‑файлов. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Загрузка HTML‑документа с потоковой передачей в Python — пошаговое руководство +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Как загрузить HTML‑документ с потоковой передачей в Python +url: /ru/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как загружать HTML‑документ с потоковой обработкой в Python + +Если вам нужно **load html document** файлы размером в несколько сотен мегабайт или больше, вы быстро столкнётесь с проблемами использования памяти. Это руководство показывает полное готовое решение, использующее **HTML streaming** для снижения потребления памяти, при этом предоставляющее полный доступ к содержимому документа. + +Вы узнаете, как настроить `HtmlSaveOptions`, включить потоковую обработку и сохранить обработанный файл — всё это в трёх коротких шагах. Ниже внешних инструментов не требуется, кроме стандартного пакета `aspose.html` для Python, что делает подход идеальным для пакетных заданий, серверных конвейеров или локальных скриптов, работающих с **large HTML files**. + +## Предварительные требования + +* Установлен Python 3.8 или новее. +* Библиотека `aspose.html` (`pip install aspose-html`) — она предоставляет `HTMLDocument` и `HtmlSaveOptions`. +* Каталог, содержащий большой HTML‑файл, с которым вы хотите работать (например, `large.html`). + +Эти требования минимальны, поэтому вы можете сосредоточиться на основной логике эффективной загрузки HTML‑документа. + +## Шаг 1: Загрузка HTML‑документа + +Первая операция — создать экземпляр `HTMLDocument`, указывающий на исходный файл. Этот объект представляет операцию **load html document** и лениво разбирает разметку, что необходимо для работы с большими файлами. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Почему это важно:** +Создание объекта `HTMLDocument` не читает сразу весь файл в память. Вместо этого он подготавливает потоковый парсер, который будет считывать данные с диска по мере необходимости. Такой дизайн позволяет работать с файлами, превышающими объём ОЗУ вашего компьютера. + +## Шаг 2: Включение потоковой обработки с HtmlSaveOptions + +Чтобы сохранять небольшое потребление памяти при манипуляциях или сохранении документа, необходимо включить режим потоковой обработки в `HtmlSaveOptions`. Этот вторичный параметр, **HtmlSaveOptions**, управляет тем, как библиотека записывает выходной файл. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Зачем включать потоковую обработку?** +Когда `enable_streaming` установлен в `True`, библиотека записывает вывод кусками, а не буферизует весь результат в памяти. Это критично, когда вы позже **save the document** или выполняете преобразования над **large HTML files**. + +## Шаг 3: Сохранение документа с настроенными параметрами + +Теперь, когда потоковая обработка активна, вы можете безопасно записать обработанное содержимое в новый файл. Метод `save` учитывает настроенные `HtmlSaveOptions`, обеспечивая экономию памяти. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Что происходит за кулисами:** +Вызов `save` передаёт HTML‑разметку в `large_out.html` по частям. Поскольку документ был загружен с помощью потокового парсера, весь конвейер — от загрузки до сохранения — работает с постоянным, небольшим потреблением памяти. + +## Полный рабочий пример + +Объединив три шага, вы получаете компактный скрипт, который можно запустить непосредственно из командной строки: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Ожидаемый вывод** + +При запуске скрипта (`python load_html_document_streaming.py`) вы должны увидеть: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Файл `large_out.html` будет точной копией оригинала, но он был обработан без полной загрузки файла в ОЗУ. + +## Часто задаваемые вопросы и обработка крайних случаев + +### Работает ли это с HTML‑файлами, содержащими внешние ресурсы (изображения, CSS, скрипты)? + +Да. Потоковый парсер рассматривает внешние ссылки как обычные атрибуты. Он **не** загружает ресурсы, если вы явно не запросите их. Если необходимо встроить эти ресурсы, вы можете использовать дополнительные API из `aspose.html` после загрузки документа. + +### Что делать, если исходный файл повреждён или не является корректным HTML? + +`HTMLDocument` попытается восстановиться от незначительных ошибок, но серьёзные нарушения вызывают исключение. Оберните шаг загрузки в блок `try/except`, чтобы корректно обрабатывать такие случаи: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Могу ли я изменить DOM перед сохранением? + +Конечно. После загрузки у вас есть полный доступ к дереву DOM (`html_doc.dom`). Вы можете вставлять узлы, удалять элементы или изменять атрибуты, а затем вызвать `save`, при этом потоковая обработка остаётся включённой. Потребление памяти останется низким, поскольку изменения применяются поэтапно. + +### Влияет ли потоковая обработка на качество вывода? + +Нет. Потоковый вывод байт‑за‑байтом идентичен тому, что вы получили бы при обычном сохранении, при условии, что вы не вносили изменений в DOM. Потоковая обработка меняет лишь способ записи данных, а не их содержание. + +## Совет по производительности: измерение использования памяти + +Если вы хотите убедиться, что потоковая обработка действительно снижает потребление памяти, можете использовать библиотеку `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Обычно вы увидите лишь несколько мегабайт ОЗУ, даже для HTML‑файлов размером 500 МБ. + +## Заключение + +В этом руководстве вы узнали, как эффективно **load html document** в Python, используя: + +1. Создание `HTMLDocument` для ленивой разбора файла. +2. Настройку `HtmlSaveOptions` с `enable_streaming = True` для записи с низким потреблением памяти. +3. Сохранение документа с потоковой записью на диск. + +Эти три шага предоставляют надёжный шаблон для обработки **large HTML files** с использованием техник **Python HTML processing**. Отсюда вы можете расширить скрипт для изменения DOM, извлечения данных или пакетной обработки десятков файлов — всё при предсказуемом использовании памяти. + +## Следующие шаги + +* Изучите DOM‑API `aspose.html` для извлечения таблиц, ссылок или изображений. +* Сочетайте этот подход с многопоточностью для параллельной обработки нескольких файлов. +* Обратите внимание на `HtmlLoadOptions`, если необходимо управлять кодировкой символов или другими нюансами разбора. + +Удачной разработки, и наслаждайтесь экономичным по памяти способом **load html document** в масштабе! + +## Что следует изучить дальше? + +Следующие руководства охватывают тесно связанные темы, опирающиеся на техники, продемонстрированные в этом руководстве. Каждый ресурс включает полные рабочие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы к реализации в ваших проектах. + +- [Загрузить HTML‑документ Java – Полное руководство с XPath и CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/spanish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..edad53e373 --- /dev/null +++ b/html/spanish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: Convierte HTML a Markdown en Python con un ejemplo completo. Aprende + cómo guardar HTML como Markdown, elegir formateadores y habilitar funciones específicas. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: es +lastmod: 2026-10-02 +og_description: Convierte HTML a Markdown en Python con código práctico, opciones + de formateador y banderas de funciones. Sigue esta guía para guardar HTML como Markdown + rápidamente. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Convertir HTML a Markdown en Python – tutorial completo +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Cómo convertir HTML a Markdown en Python – guía paso a paso +url: /es/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo convertir HTML a Markdown en Python – guía paso a paso + +Si necesitas **convertir HTML a Markdown**, esta guía te muestra una solución completa y ejecutable en Python. Verás cómo **guardar HTML como Markdown**, elegir el formateador adecuado y habilitar solo las funciones que te interesan. + +Convertir HTML a Markdown es una tarea común cuando deseas documentación ligera, contenido para sitios estáticos o archivos de texto bajo control de versiones. Este tutorial cubre todo, desde la instalación de la biblioteca hasta el manejo de casos límite, para que puedas aplicar la técnica a cualquier fuente HTML. + +## Prerequisites + +Antes de comenzar, asegúrate de tener: + +* Python 3.8 o superior instalado. +* Acceso a `pip` para instalar paquetes de terceros. +* Familiaridad básica con etiquetas HTML y sintaxis Markdown. + +No se requieren dependencias de sistema adicionales porque la biblioteca de conversión es puro Python. + +## Install the GroupDocs Conversion library + +El ejemplo de código usa el paquete Python **GroupDocs.Conversion**, que proporciona `HTMLDocument`, `MarkdownSaveOptions` y `Converter`. Instálalo con: + +```bash +pip install groupdocs-conversion +``` + +> **Consejo profesional:** Usa un entorno virtual (`python -m venv venv`) para mantener el paquete aislado de otros proyectos. + +## Paso 1: Crear un `HTMLDocument` a partir de una cadena + +El primer paso es envolver tu HTML sin procesar en una instancia de `HTMLDocument`. Este objeto abstrae la fuente, ya sea que provenga de una cadena, un archivo o una URL remota. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Por qué es importante:* `HTMLDocument` analiza el marcado una vez, permitiendo que el conversor trabaje con una representación normalizada en lugar de texto sin procesar. + +## Paso 2: Configurar `MarkdownSaveOptions` + +`MarkdownSaveOptions` te permite controlar el formato de salida y qué características de Markdown se generan. La biblioteca soporta dos formateadores: + +* **DEFAULT** – Markdown estándar compatible con CommonMark. +* **GIT** – Markdown al estilo Git (añade tablas, tachado, etc.). + +Para la mayoría de los escenarios de control de versiones, se prefiere el formateador **GIT**. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Habilitando solo las funciones necesarias + +Puedes afinar la salida activando banderas de características específicas. En este ejemplo mantenemos **enlaces** y **párrafos** mientras desactivamos imágenes, tablas y otras construcciones. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Por qué es importante:* Limitar las características reduce el tamaño del archivo generado y evita elementos Markdown inesperados que las herramientas posteriores podrían no soportar. + +## Paso 3: Convertir el documento + +Con el `HTMLDocument` de origen y el `MarkdownSaveOptions` configurado, la conversión es una única llamada a `Converter.convert`. Proporciona una ruta absoluta o relativa para el archivo de salida. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Después de que la llamada finalice, `output.md` contiene la representación Markdown del HTML original. + +## Script completo que puedes ejecutar hoy + +A continuación se muestra el script completo y autónomo que incorpora todos los pasos anteriores. Guárdalo como `html_to_md.py` y ejecuta `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Salida esperada (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +La salida coincide con la estructura HTML original mientras expone solo las características que habilitamos (enlaces, párrafos y listas). + +## Manejo de casos límite comunes + +### Atributos `href` ausentes o mal formados + +Si una etiqueta `` carece de un `href` válido, el conversor inserta el texto del enlace sin URL. Para mantener la legibilidad, puede que quieras post‑procesar el Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Convertir archivos HTML grandes + +Para archivos HTML de varios megabytes, transmite la entrada para evitar cargar todo el marcado en memoria: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +El proceso de conversión en sí permanece sin cambios porque `HTMLDocument` abstrae el tamaño de la fuente. + +## Formateadores alternativos + +Si prefieres CommonMark puro en lugar de la salida al estilo Git, cambia el formateador: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Esto produce un archivo Markdown más minimalista, útil cuando apuntas a plataformas que no soportan extensiones de Git. + +## Tareas relacionadas que podrías explorar a continuación + +* **Convertir Markdown de nuevo a HTML** – útil para previsualizar documentación. +* **Exportar HTML a PDF** – otro flujo de trabajo común adyacente a la **conversión de html a markdown**. +* **Procesar por lotes una carpeta de archivos HTML** – iterar sobre los archivos y reutilizar la misma instancia de `MarkdownSaveOptions`. + +Todas siguen el mismo patrón: crear un documento fuente, configurar las opciones de guardado y llamar a `Converter.convert`. + +## Conclusión + +Ahora sabes cómo **convertir HTML a Markdown** en Python, cómo **guardar HTML como Markdown** con control preciso de características, y por qué seleccionar el formateador adecuado es importante para las herramientas posteriores. El ejemplo muestra un enfoque limpio y reutilizable que funciona para cadenas únicas, archivos o URLs, e incluye consejos para manejar enlaces faltantes y entradas grandes. + +Siéntete libre de experimentar con `MarkdownSaveOptions.Features` adicionales (p. ej., `IMAGE`, `TABLE`) para adaptar la salida a las necesidades de tu proyecto. Si encontraste útil esta guía, compártela con tus compañeros o enlázala desde la documentación de tu proyecto. ¡Feliz conversión! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/spanish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..c336cb4b42 --- /dev/null +++ b/html/spanish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Aprende a crear documentos SVG en Python, guardar SVG en un archivo y + exportar la imagen SVG con un script corto y completo. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: es +lastmod: 2026-10-02 +og_description: Crea un documento SVG en Python y exporta la imagen SVG con este tutorial + práctico. Sigue el script, guarda el SVG en un archivo y reutiliza el gráfico vectorial + al instante. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Crear documento SVG en Python – guía paso a paso +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Cómo crear un documento SVG y exportarlo como imagen en Python +url: /es/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo crear un documento SVG y exportarlo como una imagen en Python + +Si necesitas **crear un documento SVG** programáticamente, este tutorial te muestra exactamente cómo hacerlo con Python. Verás un script completo que construye un círculo simple, guarda el SVG en un archivo y produce una imagen SVG exportable que puedes incrustar donde quieras. + +Generar gráficos vectoriales escalables desde código elimina el esfuerzo manual de dibujar formas en un editor GUI. Al final de esta guía podrás integrar la creación de SVG en pipelines de visualización de datos, generadores de informes automatizados o cualquier proyecto que requiera gráficos nítidos e independientes de la resolución. + +## Requisitos previos + +Antes de comenzar, asegúrate de tener: + +- Python 3.8 o superior instalado +- La biblioteca `svgwrite` (instálala con `pip install svgwrite`) +- Permiso de escritura en el directorio donde se guardará el SVG + +Estos requisitos mantienen el ejemplo liviano y compatible con la mayoría de entornos. + +## Paso 1: Instalar e importar la biblioteca SVG + +El primer paso es añadir la biblioteca de terceros que proporciona una API conveniente para la creación de SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstrae la estructura XML de un archivo SVG, permitiéndote centrarte en la geometría en lugar de en el marcado bruto. + +## Paso 2: Crear un objeto de documento SVG + +Ahora puedes **crear un documento SVG** instanciando `svgwrite.Drawing`. Este objeto representa el elemento raíz `` y contiene todas las formas posteriores. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +El argumento `size` define las dimensiones en píxeles renderizadas, mientras que `viewBox` establece un sistema de coordenadas que coincide con la geometría que definirás más adelante. + +## Paso 3: Añadir un elemento círculo + +Un círculo se define por su centro (`cx`, `cy`) y radio (`r`). Usa el ayudante `circle` para asignar estos atributos. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +El círculo se sitúa en el centro del lienzo de 100 × 100, dejando un margen de 10 píxeles en cada lado. Ajusta `fill` y `stroke` para que coincidan con el lenguaje de diseño. + +## Paso 4: Guardar el SVG en un archivo + +Con el gráfico ensamblado, puedes **guardar el SVG en un archivo** usando el método `save`. Esto escribe XML bien formado que los navegadores y editores vectoriales entienden. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +El archivo `circle.svg` ahora se encuentra en el directorio de trabajo actual. Puedes abrirlo en un navegador web, Inkscape o cualquier herramienta que soporte el formato SVG. + +## Paso 5: Verificar la imagen SVG exportada + +Abre el archivo guardado en un navegador para confirmar el resultado. Deberías ver un círculo centrado con los colores especificados. El XML bruto se ve así: + +```xml + + + + +``` + +Como SVG es vectorial, puedes escalar la imagen sin pérdida de calidad, lo que la hace ideal para diseños web responsivos o impresión de alta resolución. + +## Consejo profesional: Exportar SVG como PNG o JPEG + +Si necesitas una versión raster, combina el archivo SVG con una herramienta de conversión como **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Este paso demuestra **exportar la imagen SVG** a un formato bitmap, útil cuando los sistemas posteriores no pueden renderizar SVG directamente. + +## Variaciones comunes y casos límite + +| Variación | Cómo manejarlo | +|-----------|----------------| +| Múltiples formas | Llama a `dwg.add()` para cada nuevo elemento (rect, line, path). | +| Dimensiones dinámicas | Calcula `size` y `viewBox` a partir de los datos antes de crear `Drawing`. | +| Etiquetas de texto | Usa `dwg.text("Label", insert=("10", "20"))` y aplica estilo con `font_size` y `fill`. | +| Reutilizar el documento | Mantén el objeto `Drawing` en memoria y llama a `save()` cada vez que necesites un archivo actualizado. | +| Archivos grandes | Transmite la salida usando `dwg.tostring()` y escribe a un objeto de archivo manualmente para evitar picos de memoria. | + +Abordar estos escenarios asegura que tu script **cómo generar SVG** escale desde íconos simples hasta diagramas complejos. + +## Recapitulación del script completo + +A continuación se muestra el ejemplo completo y ejecutable que incorpora todos los pasos y la conversión opcional: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Ejecutar este script produce `circle.svg` y, si `cairosvg` está instalado, `circle.png`. Ambos archivos están listos para incluirse en páginas web, informes o procesamiento adicional. + +## Conclusión + +Ahora sabes cómo **crear un documento SVG** en Python, **guardar SVG en un archivo** y **exportar la imagen SVG** para un uso más amplio. El ejemplo cubre las llamadas API esenciales, explica por qué cada paso es importante y ofrece extensiones para gráficos más complejos. + +A continuación, explora temas adicionales del **tutorial de SVG Python** como dibujar rutas, aplicar degradados y animar elementos. Integrar estas técnicas te permitirá generar gráficos vectoriales dinámicos y basados en datos directamente desde tus aplicaciones Python. ¡Feliz codificación! + +## ¿Qué deberías aprender a continuación? + +Los siguientes tutoriales cubren temas estrechamente relacionados que se basan en las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarte a dominar características adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Crear y gestionar documentos SVG en Aspose.HTML para Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Guardar documento SVG en Aspose.HTML para Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg a png java – Convertir SVG a imagen con Aspose.HTML para Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/spanish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..075e79bff9 --- /dev/null +++ b/html/spanish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,239 @@ +--- +category: general +date: 2026-10-02 +description: Aprende cómo cargar un documento HTML en Python con HtmlSaveOptions y + transmisión para procesar archivos HTML grandes de manera eficiente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: es +lastmod: 2026-10-02 +og_description: Cargar documento HTML en Python usando HtmlSaveOptions y streaming. + Este tutorial muestra una solución completa, lista para ejecutar, para archivos + HTML grandes. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Cargar documento HTML con streaming en Python – guía paso a paso +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Cómo cargar un documento HTML con streaming en Python +url: /es/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo cargar documento html con streaming en Python + +Si necesitas **cargar documento html** archivos que tengan varios cientos de megabytes o más, rápidamente te encontrarás con problemas de uso de memoria. Esta guía te muestra una solución completa, lista para ejecutar, que utiliza **HTML streaming** para mantener bajo el consumo de memoria mientras te brinda acceso total al contenido del documento. + +Aprenderás a configurar `HtmlSaveOptions`, habilitar el streaming y guardar el archivo procesado, todo en solo tres pasos concisos. No se requieren herramientas externas más allá del paquete estándar `aspose.html` para Python, lo que hace que el enfoque sea ideal para trabajos por lotes, canalizaciones del lado del servidor o scripts locales que manejan **large HTML files**. + +## Requisitos previos + +Antes de comenzar, asegúrate de tener: + +* Python 3.8 o superior instalado. +* La biblioteca `aspose.html` (`pip install aspose-html`) – esta proporciona `HTMLDocument` y `HtmlSaveOptions`. +* Un directorio que contiene el archivo HTML grande con el que deseas trabajar (p. ej., `large.html`). + +Estos requisitos son mínimos, por lo que puedes centrarte en la lógica principal de cargar un documento HTML de manera eficiente. + +## Paso 1: Cargar el documento HTML + +La primera operación es crear una instancia de `HTMLDocument` que apunte al archivo fuente. Este objeto representa la operación de **cargar documento html** y analiza el marcado de forma perezosa, lo cual es esencial para manejar archivos grandes. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Por qué es importante:** +Crear el objeto `HTMLDocument` no lee inmediatamente todo el archivo en memoria. En su lugar, prepara un analizador de streaming que extraerá datos del disco según sea necesario. Este diseño te permite trabajar con archivos que superan la RAM de tu máquina. + +## Paso 2: Habilitar streaming con HtmlSaveOptions + +Para mantener una huella de memoria baja mientras manipulas o guardas el documento, debes habilitar el modo streaming en `HtmlSaveOptions`. Esta palabra clave secundaria, **HtmlSaveOptions**, controla cómo la biblioteca escribe el archivo de salida. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**¿Por qué habilitar streaming?** +Cuando `enable_streaming` se establece en `True`, la biblioteca escribe la salida en fragmentos en lugar de almacenar todo el resultado en memoria. Esto es crucial cuando luego **guardas el documento** o realizas transformaciones en **large HTML files**. + +## Paso 3: Guardar el documento con las opciones configuradas + +Ahora que el streaming está activo, puedes escribir de forma segura el contenido procesado a un nuevo archivo. El método `save` respeta los `HtmlSaveOptions` que configuramos, asegurando que la operación siga siendo eficiente en memoria. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Qué ocurre tras bastidores:** +La llamada `save` transmite el marcado HTML a `large_out.html` pieza por pieza. Debido a que el documento se cargó con el analizador de streaming, toda la cadena de procesamiento —desde la carga hasta el guardado— funciona con un uso de memoria constante y bajo. + +## Ejemplo completo funcional + +Unir los tres pasos te brinda un script compacto que puedes ejecutar directamente desde la línea de comandos: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Salida esperada** + +Al ejecutar el script (`python load_html_document_streaming.py`), deberías ver: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +El archivo `large_out.html` será una copia fiel del original, pero se procesó sin cargar nunca todo el archivo en RAM. + +## Preguntas comunes y manejo de casos límite + +### ¿Esto funciona con archivos HTML que contienen recursos externos (imágenes, CSS, scripts)? + +Sí. El analizador de streaming trata las referencias externas como atributos ordinarios. **No** descarga los recursos a menos que los solicites explícitamente. Si necesitas incrustar esos recursos, puedes usar APIs adicionales de `aspose.html` después de cargar el documento. + +### ¿Qué pasa si el archivo fuente está corrupto o no es HTML bien formado? + +`HTMLDocument` intentará recuperarse de errores menores, pero las malformaciones graves generan una excepción. Envuelve el paso de carga en un bloque `try/except` para manejar esos casos de forma elegante: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### ¿Puedo modificar el DOM antes de guardar? + +Absolutamente. Después de cargar, tienes acceso completo al árbol DOM (`html_doc.dom`). Puedes insertar nodos, eliminar elementos o modificar atributos, y luego llamar a `save` con el streaming aún habilitado. El uso de memoria se mantendrá bajo porque los cambios se aplican de forma incremental. + +### ¿Afecta el streaming la calidad del resultado? + +No. La salida en streaming es idéntica byte a byte a lo que obtendrías con una guardada sin streaming, siempre que no hayas realizado modificaciones en el DOM. El streaming solo cambia cómo se escribe los datos, no qué se escribe. + +## Consejo de rendimiento: medir uso de memoria + +Si deseas verificar que el streaming realmente reduce el consumo de memoria, puedes usar la biblioteca `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Normalmente verás solo unos pocos megabytes de RAM utilizados, incluso para archivos HTML de 500 MB. + +## Conclusión + +En este tutorial aprendiste a **cargar documento html** de manera eficiente en Python mediante: + +1. Instanciar `HTMLDocument` para analizar el archivo de forma perezosa. +2. Configurar `HtmlSaveOptions` con `enable_streaming = True` para escrituras de bajo consumo de memoria. +3. Guardar el documento mientras se transmite la salida al disco. + +Estos tres pasos te proporcionan un patrón robusto para procesar **large HTML files** usando técnicas de **Python HTML processing**. Desde aquí puedes ampliar el script para modificar el DOM, extraer datos o procesar por lotes decenas de archivos, todo mientras mantienes predecible el uso de memoria. + +**Próximos pasos** + +* Explora la API DOM de `aspose.html` para extraer tablas, enlaces o imágenes. +* Combina este enfoque con multihilos para procesar varios archivos en paralelo. +* Investiga `HtmlLoadOptions` si necesitas controlar la codificación de caracteres u otros matices del análisis. + +¡Feliz codificación, y disfruta de la forma amigable con la memoria de **cargar documento html** a gran escala! + +## ¿Qué deberías aprender a continuación? + +Los siguientes tutoriales cubren temas estrechamente relacionados que se basan en las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarte a dominar características adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Cargar documento HTML Java – Guía completa con XPath y CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Cargar HTML usando URL en .NET con Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [Cómo habilitar JavaScript en Aspose HTML – Cargar HTML y obtener texto](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/swedish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..11cf617421 --- /dev/null +++ b/html/swedish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,248 @@ +--- +category: general +date: 2026-10-02 +description: konvertera HTML till Markdown i Python med ett komplett exempel. Lär + dig hur du sparar HTML som Markdown, väljer formaterare och aktiverar specifika + funktioner. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: sv +lastmod: 2026-10-02 +og_description: konvertera HTML till Markdown i Python med praktisk kod, formateringsalternativ + och funktionsflaggor. Följ den här guiden för att snabbt spara HTML som Markdown. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Konvertera HTML till Markdown i Python – fullständig handledning +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Hur man konverterar HTML till Markdown i Python – steg‑för‑steg‑guide +url: /sv/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur man konverterar HTML till Markdown i Python – steg‑för‑steg guide + +Om du behöver **konvertera HTML till Markdown**, visar den här guiden en komplett, körbar lösning i Python. Du kommer att se hur du **sparar HTML som Markdown**, väljer rätt formatterare och aktiverar endast de funktioner du bryr dig om. + +Att konvertera HTML till Markdown är en vanlig uppgift när du vill ha lättviktig dokumentation, statisk‑webbplatsinnehåll eller versionskontrollerade textfiler. Denna handledning täcker allt från att installera biblioteket till att hantera edge‑cases, så att du kan tillämpa tekniken på vilken HTML‑källa som helst. + +## Förutsättningar + +Innan du börjar, se till att du har: + +* Python 3.8 eller nyare installerat. +* `pip`‑åtkomst för att installera tredjepartspaket. +* Grundläggande kunskap om HTML‑taggar och Markdown‑syntax. + +Inga ytterligare systemberoenden krävs eftersom konverteringsbiblioteket är ren Python. + +## Installera GroupDocs Conversion‑biblioteket + +Kodexemplet använder **GroupDocs.Conversion**‑paketet för Python, som tillhandahåller `HTMLDocument`, `MarkdownSaveOptions` och `Converter`. Installera det med: + +```bash +pip install groupdocs-conversion +``` + +> **Proffstips:** Använd en virtuell miljö (`python -m venv venv`) för att hålla paketet isolerat från andra projekt. + +## Steg 1: Skapa ett `HTMLDocument` från en sträng + +Det första steget är att omsluta din råa HTML i en `HTMLDocument`‑instans. Detta objekt abstraherar källan, oavsett om den kommer från en sträng, en fil eller en fjärr‑URL. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Varför detta är viktigt:* `HTMLDocument` analyserar markupen en gång, vilket gör att konverteraren kan arbeta med en normaliserad representation istället för rå text. + +## Steg 2: Konfigurera `MarkdownSaveOptions` + +`MarkdownSaveOptions` låter dig styra utdataformatet och vilka Markdown‑funktioner som genereras. Biblioteket stöder två formatterare: + +* **DEFAULT** – standard CommonMark‑kompatibel Markdown. +* **GIT** – Git‑flavored Markdown (lägger till tabeller, genomstrykning osv.). + +För de flesta versionskontrollscenario är **GIT**‑formatteraren föredragen. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Aktivera endast de nödvändiga funktionerna + +Du kan finjustera utdata genom att slå på specifika funktionsflaggor. I detta exempel behåller vi **links** och **paragraphs** medan vi inaktiverar bilder, tabeller och andra konstruktioner. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Varför detta är viktigt:* Att begränsa funktioner minskar storleken på den genererade filen och förhindrar oväntade Markdown‑element som nedströmsverktyg kanske inte stödjer. + +## Steg 3: Konvertera dokumentet + +Med käll‑`HTMLDocument` och de konfigurerade `MarkdownSaveOptions` är konverteringen ett enda anrop till `Converter.convert`. Ange en absolut eller relativ sökväg för utdatafilen. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +När anropet är klart innehåller `output.md` Markdown‑representationen av den ursprungliga HTML‑koden. + +## Fullständigt skript du kan köra idag + +Nedan är det kompletta, fristående skriptet som inkluderar alla tidigare steg. Spara det som `html_to_md.py` och kör `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Förväntad utdata (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Utdata matchar den ursprungliga HTML‑strukturen samtidigt som den bara visar de funktioner vi aktiverade (links, paragraphs och lists). + +## Hantera vanliga edge‑cases + +### Saknade eller felaktiga `href`‑attribut + +Om en ``‑tagg saknar ett giltigt `href`, infogar konverteraren länktexten utan en URL. För att bevara läsbarheten kan du vilja efterbearbeta Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Konvertera stora HTML‑filer + +För HTML‑filer på flera megabyte, strömma indata för att undvika att ladda hela markupen i minnet: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Konverteringsprocessen i sig förblir oförändrad eftersom `HTMLDocument` abstraherar bort källans storlek. + +## Alternativa formatterare + +Om du föredrar ren CommonMark snarare än Git‑flavored‑utdata, byt formatterare: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Detta ger en mer minimal Markdown‑fil, användbar när du riktar dig mot plattformar som inte stödjer Git‑tillägg. + +## Relaterade uppgifter du kan utforska härnäst + +* **Convert Markdown back to HTML** – användbart för att förhandsgranska dokumentation. +* **Export HTML to PDF** – ett annat vanligt **html to markdown conversion**‑adjacent arbetsflöde. +* **Batch process a folder of HTML files** – loopa över filer och återanvänd samma `MarkdownSaveOptions`‑instans. + +Alla dessa följer samma mönster: skapa ett källdokument, konfigurera sparalternativ och anropa `Converter.convert`. + +## Slutsats + +Du vet nu hur du **konverterar HTML till Markdown** i Python, hur du **sparar HTML som Markdown** med exakt funktionskontroll, och varför valet av rätt formatterare är viktigt för nedströmsverktyg. Exemplet visar en ren, återanvändbar metod som fungerar för enstaka strängar, filer eller URL:er, och det innehåller tips för att hantera saknade länkar och stora indata. + +Känn dig fri att experimentera med ytterligare `MarkdownSaveOptions.Features` (t.ex. `IMAGE`, `TABLE`) för att anpassa utdata efter ditt projekts behov. Om du fann den här guiden hjälpsam, dela den med kollegor eller länka till den från din projektdokumentation. Lycka till med konverteringen! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/swedish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..1cfda24b76 --- /dev/null +++ b/html/swedish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,210 @@ +--- +category: general +date: 2026-10-02 +description: Lär dig hur du skapar SVG-dokument i Python, sparar SVG till fil och + exporterar SVG-bilden med ett kort, komplett skript. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: sv +lastmod: 2026-10-02 +og_description: Skapa SVG-dokument i Python och exportera SVG-bilden med den här praktiska + handledningen. Följ skriptet, spara SVG till fil och återanvänd vektorgrafiken omedelbart. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Skapa SVG-dokument i Python – steg‑för‑steg guide +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Hur man skapar SVG-dokument och exporterar det som en bild i Python +url: /sv/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Så skapar du SVG-dokument och exporterar det som en bild i Python + +Om du behöver **skapa SVG-dokument** programatiskt, visar den här handledningen exakt hur du gör det med Python. Du kommer att se ett komplett skript som bygger en enkel cirkel, sparar SVG-filen, och producerar en exportbar SVG-bild som du kan bädda in var som helst. + +Att generera skalbara vektorgrafik från kod tar bort det manuella arbetet med att rita former i en GUI-redigerare. I slutet av den här guiden kan du integrera SVG-skapande i data‑visualiserings‑pipelines, automatiska rapportgeneratorer eller vilket projekt som helst som kräver skarpa, upplösningsoberoende grafik. + +## Förutsättningar + +- Python 3.8 eller nyare installerat +- Biblioteket `svgwrite` (installera med `pip install svgwrite`) +- Skrivbehörighet till den katalog där SVG-filen kommer att sparas + +Dessa krav håller exemplet lättviktigt och kompatibelt med de flesta miljöer. + +## Steg 1: Installera och importera SVG-biblioteket + +Det första steget är att lägga till det tredjepartsbibliotek som erbjuder ett bekvämt API för SVG-skapande. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` abstraherar XML‑strukturen i en SVG‑fil, så att du kan fokusera på geometri istället för rå markup. + +## Steg 2: Skapa ett SVG-dokumentobjekt + +Nu kan du **skapa SVG-dokument** genom att instansiera `svgwrite.Drawing`. Detta objekt representerar rot‑elementet `` och innehåller alla efterföljande former. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size`‑argumentet definierar de renderade pixelmåtten, medan `viewBox` etablerar ett koordinatsystem som matchar den geometri du kommer att definiera senare. + +## Steg 3: Lägg till ett cirkelelement + +En cirkel definieras av dess centrum (`cx`, `cy`) och radie (`r`). Använd `circle`‑hjälpen för att tilldela dessa attribut. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Cirkeln sitter i mitten av en 100 × 100‑canvas, med en marginal på 10 pixlar på varje sida. Justera `fill` och `stroke` för att matcha ditt design‑språk. + +## Steg 4: Spara SVG till fil + +När grafiken är sammansatt kan du **spara SVG till fil** med `save`‑metoden. Detta skriver välformad XML som webbläsare och vektorredigerare förstår. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Filen `circle.svg` finns nu i den aktuella arbetskatalogen. Du kan öppna den i en webbläsare, Inkscape eller vilket verktyg som helst som stödjer SVG‑formatet. + +## Steg 5: Verifiera den exporterade SVG‑bilden + +Öppna den sparade filen i en webbläsare för att bekräfta resultatet. Du bör se en centrerad cirkel med de angivna färgerna. Den råa XML‑koden ser ut så här: + +```xml + + + + +``` + +Eftersom SVG är vektorbaserat kan du skala bilden utan kvalitetsförlust, vilket gör den idealisk för responsiv webbdesign eller högupplöst tryck. + +## Proffstips: Exportera SVG som PNG eller JPEG + +Om du behöver en rasterversion, kombinera SVG‑filen med ett konverteringsverktyg som **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Detta steg demonstrerar **exportera SVG‑bild** till ett bitmapformat, användbart när nedströms system inte kan rendera SVG direkt. + +## Vanliga variationer och kantfall + +| Variation | Hur man hanterar | +|-----------|------------------| +| Flera former | Anropa `dwg.add()` för varje nytt element (rect, line, path). | +| Dynamiska dimensioner | Beräkna `size` och `viewBox` från data innan du skapar `Drawing`. | +| Textetiketter | Använd `dwg.text("Label", insert=("10", "20"))` och stilisera med `font_size` och `fill`. | +| Återanvända dokumentet | Behåll `Drawing`‑objektet i minnet och anropa `save()` när du behöver en uppdaterad fil. | +| Stora filer | Strömma utdata med `dwg.tostring()` och skriv till ett filobjekt manuellt för att undvika minnesspikar. | + +Att hantera dessa scenarier säkerställer att ditt **how to generate SVG**‑skript skalar från enkla ikoner till komplexa diagram. + +## Fullständig skriptöversikt + +Nedan är det kompletta, körbara exemplet som inkluderar alla steg och valfri konvertering: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +## Slutsats + +Du vet nu hur du **skapar SVG-dokument** i Python, **sparar SVG till fil**, och **exporterar SVG-bild** för bredare användning. Exemplet täcker de väsentliga API‑anropen, förklarar varför varje steg är viktigt, och erbjuder utökningar för mer komplex grafik. + +Nästa steg är att utforska ytterligare **SVG Python tutorial**‑ämnen som att rita banor, applicera gradienter och animera element. Att integrera dessa tekniker låter dig generera dynamisk, datadriven vektorgrafik direkt från dina Python‑applikationer. Lycka till med kodandet! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstrerats i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Skapa och hantera SVG-dokument i Aspose.HTML för Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Spara SVG-dokument i Aspose.HTML för Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg till png java – Konvertera SVG till bild med Aspose.HTML för Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/swedish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..7de7c25bc4 --- /dev/null +++ b/html/swedish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,236 @@ +--- +category: general +date: 2026-10-02 +description: Lär dig hur du laddar HTML-dokument i Python med HtmlSaveOptions och + streaming för att effektivt bearbeta stora HTML-filer. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: sv +lastmod: 2026-10-02 +og_description: Läs in HTML-dokument i Python med HtmlSaveOptions och streaming. Den + här handledningen visar en komplett, färdigkörbar lösning för stora HTML-filer. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Läs in HTML-dokument med streaming i Python – steg‑för‑steg‑guide +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Hur man laddar HTML-dokument med streaming i Python +url: /sv/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur du laddar html-dokument med streaming i Python + +Om du behöver **load html document** filer som är flera hundra megabyte eller större, kommer du snabbt att stöta på minnes‑användningsproblem. Den här guiden visar en komplett, färdigkörbar lösning som använder **HTML streaming** för att hålla minnesförbrukningen låg samtidigt som du får full åtkomst till dokumentets innehåll. + +Du kommer att lära dig hur du konfigurerar `HtmlSaveOptions`, aktiverar streaming och sparar den bearbetade filen – allt i bara tre koncisa steg. Inga externa verktyg krävs utöver det standard `aspose.html` Python‑paketet, vilket gör metoden idealisk för batch‑jobb, server‑sidiga pipelines eller lokala skript som hanterar **large HTML files**. + +## Förutsättningar + +* Python 3.8 eller nyare installerat. +* `aspose.html`‑biblioteket (`pip install aspose-html`) – detta tillhandahåller `HTMLDocument` och `HtmlSaveOptions`. +* En katalog som innehåller den stora HTML‑filen du vill arbeta med (t.ex. `large.html`). + +Dessa krav är minimala, så du kan fokusera på kärnlogiken för att ladda ett HTML‑dokument effektivt. + +## Steg 1: Ladda HTML‑dokumentet + +Den första operationen är att skapa en `HTMLDocument`‑instans som pekar på källfilen. Detta objekt representerar **load html document**‑operationen och parsar markupen på ett lat sätt, vilket är avgörande för att hantera stora filer. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Varför detta är viktigt:** +Att skapa `HTMLDocument`‑objektet läser inte omedelbart in hela filen i minnet. Istället förbereder det en streaming‑parser som hämtar data från disken efter behov. Denna design låter dig arbeta med filer som överstiger din dators RAM. + +## Steg 2: Aktivera streaming med HtmlSaveOptions + +För att hålla minnesavtrycket lågt medan du manipulerar eller sparar dokumentet måste du aktivera streaming‑läget på `HtmlSaveOptions`. Detta sekundära nyckelord, **HtmlSaveOptions**, styr hur biblioteket skriver utdatafilen. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Varför aktivera streaming?** +När `enable_streaming` är satt till `True` skriver biblioteket utdata i bitar istället för att buffra hela resultatet i minnet. Detta är avgörande när du senare **save the document** eller utför transformationer på **large HTML files**. + +## Steg 3: Spara dokumentet med de konfigurerade alternativen + +Nu när streaming är aktivt kan du säkert skriva det bearbetade innehållet till en ny fil. `save`‑metoden respekterar de `HtmlSaveOptions` vi konfigurerade, vilket säkerställer att operationen förblir minnes‑effektiv. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Vad som händer bakom kulisserna:** +`save`‑anropet streamar HTML‑markupen till `large_out.html` bit för bit. Eftersom dokumentet laddades med streaming‑parsern fungerar hela kedjan – från laddning till sparning – med en konstant, låg minnesanvändning. + +## Fullständigt fungerande exempel + +Att sätta ihop de tre stegen ger dig ett kompakt skript som du kan köra direkt från kommandoraden: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Förväntat resultat** + +När du kör skriptet (`python load_html_document_streaming.py`) bör du se: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Filen `large_out.html` blir en trogen kopia av originalet, men den bearbetades utan att någonsin ladda in hela filen i RAM. + +## Vanliga frågor och hantering av kantfall + +### Fungerar detta med HTML‑filer som innehåller externa resurser (bilder, CSS, skript)? + +Ja. Streaming‑parsern behandlar externa referenser som vanliga attribut. Den **laddar inte ner** resurserna om du inte uttryckligen begär det. Om du behöver bädda in dessa resurser kan du använda ytterligare API:er från `aspose.html` efter att dokumentet har laddats. + +### Vad händer om källfilen är korrupt eller inte väl‑formad HTML? + +`HTMLDocument` kommer att försöka återhämta sig från mindre fel, men allvarliga missbildningar kastar ett undantag. Omge laddningssteget med ett `try/except`‑block för att hantera sådana fall på ett smidigt sätt: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Kan jag modifiera DOM innan jag sparar? + +Absolut. Efter laddning har du full åtkomst till DOM‑trädet (`html_doc.dom`). Du kan infoga noder, ta bort element eller ändra attribut, och sedan anropa `save` med streaming fortfarande aktiverat. Minnesanvändningen förblir låg eftersom förändringarna appliceras inkrementellt. + +### Påverkar streaming utskriftskvaliteten? + +Nej. Den streamade utskriften är byte‑för‑byte identisk med vad du skulle få från en icke‑streamad sparning, förutsatt att du inte har gjort några DOM‑modifieringar. Streaming ändrar bara hur data skrivs, inte vad som skrivs. + +## Prestandatips: mät minnesanvändning + +Om du vill verifiera att streaming verkligen minskar minnesförbrukningen kan du använda `psutil`‑biblioteket: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Du kommer vanligtvis att se endast några få megabyte RAM-användning, även för 500 MB HTML‑filer. + +## Slutsats + +I den här handledningen lärde du dig hur du **load html document** effektivt i Python genom att: + +1. Instansiera `HTMLDocument` för att parsar filen på ett lat sätt. +2. Konfigurera `HtmlSaveOptions` med `enable_streaming = True` för lågminnes‑skrivningar. +3. Spara dokumentet medan du streamar utdata till disk. + +Dessa tre steg ger dig ett robust mönster för att bearbeta **large HTML files** med **Python HTML processing**‑tekniker. Härifrån kan du utöka skriptet för att modifiera DOM, extrahera data eller batch‑processa dussintals filer – allt medan minnesanvändningen förblir förutsägbar. + +**Nästa steg** + +* Utforska `aspose.html` DOM‑API:t för att extrahera tabeller, länkar eller bilder. +* Kombinera detta tillvägagångssätt med multitrådning för att bearbeta flera filer parallellt. +* Titta på `HtmlLoadOptions` om du behöver styra teckenkodning eller andra parsningsegenskaper. + +Lycka till med kodandet, och njut av det minnesvänliga sättet att **load html document** i skala! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstrerats i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/thai/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..5ca4ac5707 --- /dev/null +++ b/html/thai/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: แปลง HTML เป็น Markdown ด้วย Python พร้อมตัวอย่างครบถ้วน เรียนรู้วิธีบันทึก + HTML เป็น Markdown เลือกตัวจัดรูปแบบ และเปิดใช้งานฟีเจอร์เฉพาะ +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: th +lastmod: 2026-10-02 +og_description: แปลง HTML เป็น Markdown ด้วย Python พร้อมโค้ดที่ใช้งานได้จริง ตัวเลือกการจัดรูปแบบ + และฟีเจอร์ฟลักซ์. ทำตามคู่มือนี้เพื่อบันทึก HTML เป็น Markdown อย่างรวดเร็ว. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: แปลง HTML เป็น Markdown ด้วย Python – คู่มือเต็ม +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: วิธีแปลง HTML เป็น Markdown ด้วย Python – คู่มือแบบขั้นตอนต่อขั้นตอน +url: /th/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีแปลง HTML เป็น Markdown ใน Python – คู่มือขั้นตอนโดยละเอียด + +หากคุณต้องการ **แปลง HTML เป็น Markdown** คู่มือนี้จะแสดงวิธีแก้ปัญหาที่สมบูรณ์และสามารถรันได้ใน Python คุณจะได้เห็นวิธี **บันทึก HTML เป็น Markdown** การเลือกตัวจัดรูปแบบที่เหมาะสม และการเปิดใช้งานเฉพาะฟีเจอร์ที่คุณต้องการ + +การแปลง HTML เป็น Markdown เป็นงานทั่วไปเมื่อคุณต้องการเอกสารที่มีน้ำหนักเบา เนื้อหาเว็บไซต์แบบสแตติก หรือไฟล์ข้อความที่ควบคุมเวอร์ชันได้ tutorial นี้ครอบคลุมทุกอย่างตั้งแต่การติดตั้งไลบรารีจนถึงการจัดการกรณีขอบเขต เพื่อให้คุณสามารถนำเทคนิคนี้ไปใช้กับแหล่ง HTML ใดก็ได้ + +## Prerequisites + +ก่อนเริ่มทำงาน โปรดตรวจสอบว่าคุณมี: + +* Python 3.8 หรือใหม่กว่า ติดตั้งอยู่แล้ว +* การเข้าถึง `pip` เพื่อติดตั้งแพ็กเกจของบุคคลที่สาม +* ความคุ้นเคยพื้นฐานกับแท็ก HTML และไวยากรณ์ Markdown + +ไม่มีการพึ่งพาระบบเพิ่มเติมอื่น ๆ เนื่องจากไลบรารีการแปลงเป็น Python แท้ ๆ + +## Install the GroupDocs Conversion library + +ตัวอย่างโค้ดใช้แพ็กเกจ Python **GroupDocs.Conversion** ซึ่งให้ `HTMLDocument`, `MarkdownSaveOptions`, และ `Converter` ติดตั้งได้ด้วย: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** ใช้ virtual environment (`python -m venv venv`) เพื่อแยกแพ็กเกจออกจากโปรเจกต์อื่น ๆ + +## Step 1: Create an `HTMLDocument` from a string + +ขั้นตอนแรกคือการห่อ HTML ดิบของคุณในอ็อบเจกต์ `HTMLDocument` ซึ่งอ็อบเจกต์นี้จะทำหน้าที่เป็นตัวกลาง ไม่ว่าจะมาจากสตริง ไฟล์ หรือ URL ระยะไกล + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Why this matters:* `HTMLDocument` จะทำการพาร์ส markup ครั้งเดียว ทำให้ตัวแปลงทำงานกับการแสดงผลที่เป็นมาตรฐานแทนการทำงานกับข้อความดิบ + +## Step 2: Configure `MarkdownSaveOptions` + +`MarkdownSaveOptions` ให้คุณควบคุมรูปแบบผลลัพธ์และฟีเจอร์ Markdown ที่จะถูกสร้าง ไลบรารีรองรับตัวจัดรูปแบบสองแบบ: + +* **DEFAULT** – Markdown มาตรฐานที่เข้ากันได้กับ CommonMark +* **GIT** – Git‑flavored Markdown (เพิ่มตาราง, ขีดทับ ฯลฯ) + +สำหรับสถานการณ์ที่ต้องใช้ระบบควบคุมเวอร์ชันส่วนใหญ่ ตัวจัดรูปแบบ **GIT** จะเป็นตัวเลือกที่แนะนำ + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Enabling only the needed features + +คุณสามารถปรับแต่งผลลัพธ์โดยเปิดฟีเจอร์ที่ต้องการเท่านั้น ในตัวอย่างนี้เราจะเปิด **links** และ **paragraphs** ส่วนปิด **images**, **tables**, และโครงสร้างอื่น ๆ + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Why this matters:* การจำกัดฟีเจอร์ช่วยลดขนาดไฟล์ที่สร้างและป้องกันไม่ให้มีองค์ประกอบ Markdown ที่เครื่องมือ downstream ไม่รองรับปรากฏขึ้น + +## Step 3: Convert the document + +เมื่อมี `HTMLDocument` แหล่งที่มาและ `MarkdownSaveOptions` ที่ตั้งค่าแล้ว การแปลงทำได้ด้วยการเรียก `Converter.convert` เพียงครั้งเดียว ระบุพาธแบบ absolute หรือ relative สำหรับไฟล์ผลลัพธ์ + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +หลังจากการเรียกเสร็จสิ้น `output.md` จะมีการแสดงผล Markdown ของ HTML ดั้งเดิม + +## Full script you can run today + +ด้านล่างเป็นสคริปต์เต็มที่รวมทุกขั้นตอนก่อนหน้า บันทึกเป็น `html_to_md.py` แล้วรันด้วย `python html_to_md.py` + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Expected output (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +ผลลัพธ์จะตรงกับโครงสร้าง HTML ดั้งเดิม แต่จะเปิดเผยเฉพาะฟีเจอร์ที่เราเปิดใช้งาน (links, paragraphs, และ lists) + +## Handling common edge cases + +### Missing or malformed `href` attributes + +หากแท็ก `` ขาด `href` ที่ถูกต้อง ตัวแปลงจะใส่ข้อความลิงก์โดยไม่มี URL เพื่อรักษาความอ่านได้ คุณอาจต้องทำ post‑process Markdown เพิ่มเติม: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Converting large HTML files + +สำหรับไฟล์ HTML ขนาดหลายเมกะไบต์ ให้สตรีมอินพุตเพื่อหลีกเลี่ยงการโหลด markup ทั้งหมดเข้าหน่วยความจำ: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +กระบวนการแปลงเองยังคงไม่เปลี่ยนแปลง เพราะ `HTMLDocument` จะจัดการขนาดแหล่งที่มาให้โดยอัตโนมัติ + +## Alternative formatters + +หากคุณต้องการ CommonMark ธรรมดาแทน Git‑flavored ให้สลับตัวจัดรูปแบบ: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +วิธีนี้จะให้ไฟล์ Markdown ที่มีขนาดเล็กลง เหมาะกับแพลตฟอร์มที่ไม่รองรับส่วนขยายของ Git + +## Related tasks you might explore next + +* **Convert Markdown back to HTML** – มีประโยชน์สำหรับการพรีวิวเอกสาร +* **Export HTML to PDF** – workflow ที่พบบ่อยในกระบวนการ **html to markdown conversion**‑adjacent +* **Batch process a folder of HTML files** – วนลูปไฟล์และใช้ `MarkdownSaveOptions` ตัวเดียวกันซ้ำได้ + +ทั้งหมดนี้ทำตามรูปแบบเดียวกัน: สร้างเอกสารแหล่งที่มา ตั้งค่าตัวเลือกการบันทึก แล้วเรียก `Converter.convert` + +## Conclusion + +คุณได้เรียนรู้วิธี **แปลง HTML เป็น Markdown** ใน Python วิธี **บันทึก HTML เป็น Markdown** พร้อมการควบคุมฟีเจอร์อย่างแม่นยำ และเหตุผลที่การเลือกตัวจัดรูปแบบที่เหมาะสมสำคัญต่อเครื่องมือ downstream ตัวอย่างแสดงแนวทางที่สะอาดและนำกลับใช้ใหม่ได้สำหรับสตริง ไฟล์ หรือ URL ใด ๆ รวมถึงเคล็ดลับการจัดการลิงก์ที่หายไปและอินพุตขนาดใหญ่ + +อย่าลังเลที่จะทดลองใช้ `MarkdownSaveOptions.Features` เพิ่มเติม (เช่น `IMAGE`, `TABLE`) เพื่อปรับผลลัพธ์ให้ตรงกับความต้องการของโครงการ หากคุณพบว่าคู่มือนี้เป็นประโยชน์ โปรดแชร์ให้ทีมงานหรือใส่ลิงก์ในเอกสารโครงการของคุณ ขอให้แปลงสำเร็จ! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/thai/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..e044956bf6 --- /dev/null +++ b/html/thai/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,214 @@ +--- +category: general +date: 2026-10-02 +description: เรียนรู้วิธีสร้างเอกสาร SVG ด้วย Python, บันทึก SVG ลงไฟล์, และส่งออกภาพ + SVG ด้วยสคริปต์สั้น ๆ ที่ครบถ้วน. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: th +lastmod: 2026-10-02 +og_description: สร้างเอกสาร SVG ด้วย Python และส่งออกภาพ SVG ด้วยบทเรียนปฏิบัตินี้ + ทำตามสคริปต์ บันทึก SVG ไปยังไฟล์ และใช้กราฟิกเวกเตอร์ได้ทันที +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: สร้างเอกสาร SVG ด้วย Python – คู่มือแบบทีละขั้นตอน +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: วิธีสร้างเอกสาร SVG และส่งออกเป็นภาพใน Python +url: /th/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีสร้างเอกสาร SVG และส่งออกเป็นภาพใน Python + +หากคุณต้องการ **สร้างเอกสาร SVG** อย่างอัตโนมัติ, บทแนะนำนี้จะแสดงให้คุณเห็นขั้นตอนที่ทำได้ด้วย Python อย่างละเอียด คุณจะได้เห็นสคริปต์เต็มที่สร้างวงกลมง่าย ๆ, บันทึก SVG ลงไฟล์, และสร้างภาพ SVG ที่สามารถฝังได้ทุกที่ + +การสร้างกราฟิกเวกเตอร์ที่ปรับขนาดได้จากโค้ดช่วยลดความพยายามในการวาดรูปด้วยโปรแกรม GUI ด้วยตนเอง เมื่ออ่านจบคู่มือคุณจะสามารถผสานการสร้าง SVG เข้าไปในกระบวนการแสดงผลข้อมูล, ตัวสร้างรายงานอัตโนมัติ, หรือโครงการใด ๆ ที่ต้องการกราฟิกคมชัดและไม่ขึ้นกับความละเอียด + +## ความต้องการเบื้องต้น + +ก่อนเริ่มทำงาน, โปรดตรวจสอบว่าคุณมี: + +- Python 3.8 หรือใหม่กว่า +- ไลบรารี `svgwrite` (ติดตั้งด้วย `pip install svgwrite`) +- สิทธิ์การเขียนในไดเรกทอรีที่ต้องการบันทึกไฟล์ SVG + +ข้อกำหนดเหล่านี้ทำให้ตัวอย่างมีน้ำหนักเบาและเข้ากันได้กับสภาพแวดล้อมส่วนใหญ่ + +## ขั้นตอนที่ 1: ติดตั้งและนำเข้าไลบรารี SVG + +ขั้นตอนแรกคือการเพิ่มไลบรารีของบุคคลที่สามที่ให้ API ที่สะดวกสำหรับการสร้าง SVG + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` ทำหน้าที่เป็นชั้นนามธรรมของโครงสร้าง XML ของไฟล์ SVG, ทำให้คุณโฟกัสที่รูปทรงเรขาคณิตแทนการจัดการ markup ดิบ + +## ขั้นตอนที่ 2: สร้างอ็อบเจ็กต์เอกสาร SVG + +ตอนนี้คุณสามารถ **สร้างเอกสาร SVG** ได้โดยการสร้างอินสแตนซ์ของ `svgwrite.Drawing`. อ็อบเจ็กต์นี้แทนองค์ประกอบ `` รากและเก็บรูปทรงทั้งหมดที่ตามมา + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +อาร์กิวเมนต์ `size` กำหนดขนาดพิกเซลที่แสดงผล, ส่วน `viewBox` กำหนดระบบพิกัดที่สอดคล้องกับเรขาคณิตที่คุณจะกำหนดต่อไป + +## ขั้นตอนที่ 3: เพิ่มองค์ประกอบวงกลม + +วงกลมถูกกำหนดด้วยศูนย์กลาง (`cx`, `cy`) และรัศมี (`r`). ใช้ตัวช่วย `circle` เพื่อแนบแอตทริบิวต์เหล่านี้ + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +วงกลมอยู่ตรงกลางของแคนวาสขนาด 100 × 100, มีระยะขอบ 10 พิกเซลในแต่ละด้าน ปรับ `fill` และ `stroke` ให้สอดคล้องกับสไตล์การออกแบบของคุณ + +## ขั้นตอนที่ 4: บันทึก SVG ลงไฟล์ + +เมื่อกราฟิกพร้อม, คุณสามารถ **บันทึก SVG ลงไฟล์** ด้วยเมธอด `save`. วิธีนี้จะเขียน XML ที่สมบูรณ์ซึ่งเบราว์เซอร์และโปรแกรมแก้ไขเวกเตอร์เข้าใจได้ + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +ไฟล์ `circle.svg` ตอนนี้อยู่ในไดเรกทอรีทำงานปัจจุบัน คุณสามารถเปิดในเว็บเบราว์เซอร์, Inkscape, หรือเครื่องมือใด ๆ ที่รองรับรูปแบบ SVG + +## ขั้นตอนที่ 5: ตรวจสอบภาพ SVG ที่ส่งออก + +เปิดไฟล์ที่บันทึกไว้ในเบราว์เซอร์เพื่อยืนยันผลลัพธ์ คุณควรเห็นวงกลมที่อยู่กึ่งกลางพร้อมสีที่กำหนด XML ดิบจะมีลักษณะดังนี้: + +```xml + + + + +``` + +เนื่องจาก SVG เป็นเวกเตอร์, คุณสามารถปรับขนาดภาพได้โดยไม่สูญเสียคุณภาพ, ทำให้เหมาะกับการออกแบบเว็บที่ตอบสนองหรือการพิมพ์ความละเอียดสูง + +## เคล็ดลับพิเศษ: ส่งออก SVG เป็น PNG หรือ JPEG + +หากต้องการเวอร์ชันเรสเตอร์, ผสานไฟล์ SVG กับเครื่องมือแปลงเช่น **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +ขั้นตอนนี้แสดงการ **ส่งออกภาพ SVG** ไปเป็นรูปแบบบิตแมป, มีประโยชน์เมื่อระบบ downstream ไม่สามารถเรนเดอร์ SVG ได้โดยตรง + +## ความแตกต่างทั่วไปและกรณีขอบ + +| Variation | How to handle | +|-----------|---------------| +| Multiple shapes | Call `dwg.add()` for each new element (rect, line, path). | +| Dynamic dimensions | Compute `size` and `viewBox` from data before creating `Drawing`. | +| Text labels | Use `dwg.text("Label", insert=("10", "20"))` and style with `font_size` and `fill`. | +| Re‑using the document | Keep the `Drawing` object in memory and call `save()` whenever you need an updated file. | +| Large files | Stream the output using `dwg.tostring()` and write to a file object manually to avoid memory spikes. | + +การจัดการกับสถานการณ์เหล่านี้ช่วยให้สคริปต์ **วิธีสร้าง SVG** ของคุณขยายจากไอคอนง่าย ๆ ไปจนถึงไดอะแกรมซับซ้อน + +## สรุปสคริปต์เต็ม + +ด้านล่างเป็นตัวอย่างที่ทำงานได้ครบถ้วนซึ่งรวมทุกขั้นตอนและการแปลงแบบเลือกได้: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +การรันสคริปต์นี้จะสร้าง `circle.svg` และหากติดตั้ง `cairosvg` แล้ว จะสร้าง `circle.png` ทั้งสองไฟล์พร้อมใช้ในหน้าเว็บ, รายงาน, หรือการประมวลผลต่อไป + +## สรุป + +คุณได้เรียนรู้วิธี **สร้างเอกสาร SVG** ด้วย Python, **บันทึก SVG ลงไฟล์**, และ **ส่งออกภาพ SVG** เพื่อการใช้งานที่กว้างขวาง ตัวอย่างครอบคลุมการเรียก API พื้นฐาน, อธิบายเหตุผลของแต่ละขั้นตอน, และเสนอส่วนขยายสำหรับกราฟิกที่ซับซ้อนยิ่งขึ้น + +ต่อไป, สำรวจหัวข้อ **SVG Python tutorial** เพิ่มเติม เช่น การวาดเส้นทาง, การใช้กราเดียนต์, และการทำแอนิเมชัน การผสานเทคนิคเหล่านี้จะทำให้คุณสร้างกราฟิกเวกเตอร์เชิงข้อมูลโดยตรงจากแอปพลิเคชัน Python ของคุณ Happy coding! + +## สิ่งที่คุณควรเรียนต่อไป + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดและต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีโค้ดทำงานเต็มรูปแบบพร้อมคำอธิบายทีละขั้นตอน เพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจแนวทางการทำงานทางเลือกในโปรเจกต์ของคุณ + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/thai/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..e1abab6fd5 --- /dev/null +++ b/html/thai/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,236 @@ +--- +category: general +date: 2026-10-02 +description: เรียนรู้วิธีโหลดเอกสาร HTML ใน Python ด้วย HtmlSaveOptions และการสตรีมเพื่อประมวลผลไฟล์ + HTML ขนาดใหญ่อย่างมีประสิทธิภาพ +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: th +lastmod: 2026-10-02 +og_description: โหลดเอกสาร HTML ใน Python โดยใช้ HtmlSaveOptions และการสตรีมมิ่ง บทแนะนำนี้แสดงวิธีแก้ปัญหาที่สมบูรณ์พร้อมใช้งานสำหรับไฟล์ + HTML ขนาดใหญ่ +og_image_alt: Diagram showing load html document using streaming in Python +og_title: โหลดเอกสาร HTML ด้วยการสตรีมใน Python – คู่มือแบบขั้นตอนต่อขั้นตอน +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: วิธีโหลดเอกสาร HTML ด้วยการสตรีมใน Python +url: /th/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีโหลดเอกสาร html ด้วยการสตรีมใน Python + +หากคุณต้องการ **load html document** ไฟล์ที่มีขนาดหลายร้อยเมกะไบต์หรือใหญ่กว่า คุณจะเจอปัญหาการใช้หน่วยความจำอย่างรวดเร็ว คู่มือนี้จะแสดงวิธีแก้ที่ครบถ้วนพร้อมใช้งานซึ่งใช้ **HTML streaming** เพื่อให้การใช้หน่วยความจำน้อยลงในขณะที่ยังให้คุณเข้าถึงเนื้อหาเอกสารได้อย่างเต็มที่ + +คุณจะได้เรียนรู้วิธีกำหนดค่า `HtmlSaveOptions` เปิดการสตรีม และบันทึกไฟล์ที่ประมวลผล—ทั้งหมดในสามขั้นตอนสั้น ๆ ไม่จำเป็นต้องใช้เครื่องมือภายนอกนอกจากแพคเกจ Python มาตรฐาน `aspose.html` ทำให้วิธีนี้เหมาะสำหรับงานแบบแบตช์, pipeline ฝั่งเซิร์ฟเวอร์, หรือสคริปต์ในเครื่องที่จัดการกับ **large HTML files**. + +## ข้อกำหนดเบื้องต้น + +* ติดตั้ง Python 3.8 หรือใหม่กว่า +* ไลบรารี `aspose.html` (`pip install aspose-html`) – ให้บริการ `HTMLDocument` และ `HtmlSaveOptions` +* โฟลเดอร์ที่มีไฟล์ HTML ขนาดใหญ่ที่คุณต้องการทำงานด้วย (เช่น `large.html`) + +ข้อกำหนดเหล่านี้มีน้อยที่สุด ทำให้คุณสามารถมุ่งเน้นที่ตรรกะหลักของการโหลดเอกสาร HTML อย่างมีประสิทธิภาพ + +## ขั้นตอนที่ 1: โหลดเอกสาร HTML + +การดำเนินการแรกคือการสร้างอินสแตนซ์ `HTMLDocument` ที่ชี้ไปยังไฟล์ต้นทาง วัตถุนี้เป็นตัวแทนของการดำเนินการ **load html document** และทำการพาร์สมาร์กอัปแบบ lazy ซึ่งจำเป็นสำหรับการจัดการไฟล์ขนาดใหญ่ + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**ทำไมเรื่องนี้ถึงสำคัญ:** +การสร้างอ็อบเจ็กต์ `HTMLDocument` ไม่ได้อ่านไฟล์ทั้งหมดเข้าสู่หน่วยความจำทันที แต่จะเตรียมตัวพาร์สแบบสตรีมที่ดึงข้อมูลจากดิสก์ตามความต้องการ การออกแบบนี้ทำให้คุณสามารถทำงานกับไฟล์ที่เกินขนาด RAM ของเครื่องได้ + +## ขั้นตอนที่ 2: เปิดการสตรีมด้วย HtmlSaveOptions + +เพื่อให้การใช้หน่วยความจำน้อยลงขณะคุณจัดการหรือบันทึกเอกสาร คุณต้องเปิดโหมดสตรีมบน `HtmlSaveOptions` คำสำคัญรองนี้, **HtmlSaveOptions**, ควบคุมวิธีที่ไลบรารีเขียนไฟล์ผลลัพธ์ + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**ทำไมต้องเปิดการสตรีม?** +เมื่อ `enable_streaming` ถูกตั้งค่าเป็น `True` ไลบรารีจะเขียนผลลัพธ์เป็นชิ้น ๆ แทนการบัฟเฟอร์ผลลัพธ์ทั้งหมดในหน่วยความจำ สิ่งนี้สำคัญเมื่อคุณต่อมาจะ **save the document** หรือทำการแปลงบน **large HTML files** + +## ขั้นตอนที่ 3: บันทึกเอกสารด้วยตัวเลือกที่กำหนดค่าแล้ว + +เมื่อการสตรีมทำงานแล้ว คุณสามารถเขียนเนื้อหาที่ประมวลผลไปยังไฟล์ใหม่ได้อย่างปลอดภัย วิธี `save` จะเคารพ `HtmlSaveOptions` ที่เราตั้งค่าไว้ ทำให้การดำเนินการยังคงใช้หน่วยความจำน้อย + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**สิ่งที่เกิดขึ้นเบื้องหลัง:** +การเรียก `save` จะสตรีมมาร์กอัป HTML ไปยัง `large_out.html` ทีละส่วน เนื่องจากเอกสารถูกโหลดด้วยพาร์สแบบสตรีม ทั้งกระบวนการ—from load to save—ทำงานด้วยการใช้หน่วยความจำคงที่และต่ำ + +## ตัวอย่างทำงานเต็มรูปแบบ + +การรวมสามขั้นตอนเข้าด้วยกันจะให้สคริปต์กะทัดรัดที่คุณสามารถรันโดยตรงจากบรรทัดคำสั่ง: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**ผลลัพธ์ที่คาดหวัง** + +เมื่อคุณรันสคริปต์ (`python load_html_document_streaming.py`) คุณควรเห็น: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +ไฟล์ `large_out.html` จะเป็นสำเนาที่ตรงกับต้นฉบับ แต่ถูกประมวลผลโดยไม่ต้องโหลดไฟล์ทั้งหมดเข้าสู่ RAM + +## คำถามทั่วไปและการจัดการกรณีขอบ + +### วิธีนี้ทำงานกับไฟล์ HTML ที่มีทรัพยากรภายนอก (รูปภาพ, CSS, สคริปต์) หรือไม่? + +ใช่ พาร์สแบบสตรีมจะถือการอ้างอิงภายนอกเป็นแอตทริบิวต์ทั่วไป มัน **ไม่** ดาวน์โหลดทรัพยากรเหล่านั้น เว้นแต่คุณจะร้องขออย่างชัดเจน หากคุณต้องการฝังทรัพยากรเหล่านั้น คุณสามารถใช้ API เพิ่มเติมจาก `aspose.html` หลังจากโหลดเอกสารแล้ว + +### หากไฟล์ต้นทางเสียหายหรือไม่ได้เป็น HTML ที่ถูกต้องตามโครงสร้างจะทำอย่างไร? + +`HTMLDocument` จะพยายามกู้คืนจากข้อผิดพลาดเล็กน้อย แต่การผิดรูปอย่างรุนแรงจะทำให้เกิดข้อยกเว้น ให้ห่อขั้นตอนการโหลดในบล็อก `try/except` เพื่อจัดการกรณีเหล่านี้อย่างราบรื่น: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### ฉันสามารถแก้ไข DOM ก่อนบันทึกได้หรือไม่? + +แน่นอน หลังจากโหลดแล้วคุณจะเข้าถึงต้นไม้ DOM อย่างเต็มที่ (`html_doc.dom`) คุณสามารถแทรกโหนด, ลบองค์ประกอบ, หรือเปลี่ยนแปลงแอตทริบิวต์ แล้วเรียก `save` โดยยังเปิดการสตรีมอยู่ การใช้หน่วยความจำจะคงต่ำเนื่องจากการเปลี่ยนแปลงถูกนำไปใช้แบบขั้นเป็นขั้น + +### การสตรีมมีผลต่อคุณภาพของผลลัพธ์หรือไม่? + +ไม่ ผลลัพธ์ที่สตรีมจะเหมือนกันแบบไบต์ต่อไบต์กับที่คุณจะได้จากการบันทึกแบบไม่สตรีม หากคุณไม่ได้ทำการแก้ไข DOM การสตรีมเพียงเปลี่ยนวิธีการเขียนข้อมูล ไม่ได้เปลี่ยนเนื้อหาที่เขียน + +## เคล็ดลับประสิทธิภาพ: วัดการใช้หน่วยความจำ + +หากคุณต้องการยืนยันว่าการสตรีมจริง ๆ ลดการใช้หน่วยความจำได้ คุณสามารถใช้ไลบรารี `psutil` : + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +โดยทั่วไปคุณจะเห็นการใช้ RAM เพียงไม่กี่เมกะไบต์ แม้กับไฟล์ HTML ขนาด 500 MB + +## สรุป + +ในบทแนะนำนี้คุณได้เรียนรู้วิธี **load html document** อย่างมีประสิทธิภาพใน Python โดย: + +1. สร้างอินสแตนซ์ `HTMLDocument` เพื่อพาร์สไฟล์แบบ lazy. +2. กำหนดค่า `HtmlSaveOptions` ด้วย `enable_streaming = True` เพื่อการเขียนที่ใช้หน่วยความจำน้อย. +3. บันทึกเอกสารโดยสตรีมผลลัพธ์ไปยังดิสก์. + +สามขั้นตอนนี้ให้รูปแบบที่มั่นคงสำหรับการประมวลผล **large HTML files** ด้วยเทคนิค **Python HTML processing** จากนี้คุณสามารถขยายสคริปต์เพื่อแก้ไข DOM, ดึงข้อมูล, หรือประมวลผลหลายไฟล์เป็นกลุ่ม—ทั้งหมดโดยคงการใช้หน่วยความจำให้คาดเดาได้ + +**ขั้นตอนต่อไป** + +* สำรวจ `aspose.html` DOM API เพื่อดึงตาราง, ลิงก์, หรือรูปภาพ. +* ผสานวิธีนี้กับการทำงานหลายเธรดเพื่อประมวลผลหลายไฟล์พร้อมกัน. +* พิจารณา `HtmlLoadOptions` หากคุณต้องการควบคุมการเข้ารหัสอักขระหรือรายละเอียดการพาร์สอื่น ๆ. + +ขอให้เขียนโค้ดอย่างสนุกสนาน และเพลิดเพลินกับวิธีที่เป็นมิตรต่อหน่วยความจำในการ **load html document** ในระดับใหญ่! + +## สิ่งที่คุณควรเรียนต่อไป + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดซึ่งต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีตัวอย่างโค้ดทำงานครบถ้วนพร้อมคำอธิบายทีละขั้นตอนเพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจแนวทางการนำไปใช้ทางเลือกในโครงการของคุณ + +- [Load HTML Document Java – คู่มือครบถ้วนกับ XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL ใน .NET กับ Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – โหลด HTML & ดึงข้อความ](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/turkish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..c7edaaa67f --- /dev/null +++ b/html/turkish/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-10-02 +description: Python'da HTML'yi Markdown'a dönüştürün, tam bir örnekle. HTML'yi Markdown + olarak kaydetmeyi, biçimlendiricileri seçmeyi ve belirli özellikleri etkinleştirmeyi + öğrenin. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: tr +lastmod: 2026-10-02 +og_description: Uygulamalı kod, biçimlendirici seçenekleri ve özellik bayraklarıyla + Python'da HTML'yi Markdown'a dönüştürün. HTML'yi hızlıca Markdown olarak kaydetmek + için bu rehberi izleyin. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Python'da HTML'yi Markdown'a Dönüştür – Tam Öğretici +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Python’da HTML’yi Markdown’a Dönüştürme – Adım Adım Rehber +url: /tr/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python'da HTML'yi Markdown'a Dönüştürme – adım adım rehber + +HTML'yi Markdown'a **dönüştürmeniz** gerekiyorsa, bu rehber Python'da tam, çalıştırılabilir bir çözüm gösterir. **HTML'yi Markdown olarak kaydetmeyi**, doğru biçimlendiriciyi seçmeyi ve sadece ihtiyacınız olan özellikleri etkinleştirmeyi öğreneceksiniz. + +HTML'yi Markdown'a dönüştürmek, hafif dokümantasyon, statik site içeriği veya sürüm kontrolü yapılan metin dosyaları istediğinizde yaygın bir görevdir. Bu öğretici, kütüphanenin kurulumu부터 kenar durumlarının ele alınmasına kadar her şeyi kapsar, böylece tekniği herhangi bir HTML kaynağına uygulayabilirsiniz. + +## Önkoşullar + +* Python 3.8 veya daha yeni bir sürüm yüklü. +* Üçüncü‑taraf paketleri kurmak için `pip` erişimi. +* HTML etiketleri ve Markdown sözdizimi hakkında temel bilgi. + +Dönüştürme kütüphanesi saf Python olduğu için ek sistem bağımlılıkları gerekmez. + +## GroupDocs Conversion kütüphanesini kurun + +Kod örneği, `HTMLDocument`, `MarkdownSaveOptions` ve `Converter` sağlayan **GroupDocs.Conversion** Python paketini kullanır. Şu şekilde kurun: + +```bash +pip install groupdocs-conversion +``` + +> **Pro ipucu:** Paketi diğer projelerden izole tutmak için bir sanal ortam kullanın (`python -m venv venv`). + +## Adım 1: Bir dizeden `HTMLDocument` oluşturun + +İlk adım, ham HTML'nizi bir `HTMLDocument` örneğine sarmaktır. Bu nesne, kaynağı bir dizeden, dosyadan veya uzak bir URL'den gelmiş olsun soyutlar. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Neden önemli:* `HTMLDocument` işaretlemeyi bir kez ayrıştırır, böylece dönüştürücü ham metin yerine normalleştirilmiş bir temsil ile çalışabilir. + +## Adım 2: `MarkdownSaveOptions` yapılandırması + +`MarkdownSaveOptions` çıktı formatını ve hangi Markdown özelliklerinin üretileceğini kontrol etmenizi sağlar. Kütüphane iki biçimlendiriciyi destekler: + +* **DEFAULT** – standart CommonMark‑uyumlu Markdown. +* **GIT** – Git‑tarzı Markdown (tablolar, üstü çizili vb. ekler). + +Çoğu sürüm‑kontrol senaryosu için **GIT** biçimlendiricisi tercih edilir. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Sadece gereken özellikleri etkinleştirme + +Çıktıyı belirli özellik bayraklarını açarak ince ayar yapabilirsiniz. Bu örnekte **bağlantılar** ve **paragraflar** korunurken, görseller, tablolar ve diğer yapılar devre dışı bırakılır. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Neden önemli:* Özellikleri sınırlamak, oluşturulan dosyanın boyutunu azaltır ve sonraki araçların desteklemeyebileceği beklenmedik Markdown öğelerinin ortaya çıkmasını önler. + +## Adım 3: Belgeyi dönüştürün + +Kaynak `HTMLDocument` ve yapılandırılmış `MarkdownSaveOptions` ile dönüşüm, `Converter.convert` tek bir çağrısıdır. Çıktı dosyası için mutlak veya göreli bir yol sağlayın. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Çağrı tamamlandıktan sonra, `output.md` orijinal HTML'nin Markdown temsili içerir. + +## Bugün çalıştırabileceğiniz tam betik + +Aşağıda, önceki tüm adımları içeren eksiksiz, bağımsız bir betik bulunmaktadır. `html_to_md.py` olarak kaydedin ve `python html_to_md.py` komutuyla çalıştırın. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Beklenen çıktı (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Çıktı, orijinal HTML yapısını korurken yalnızca etkinleştirdiğimiz özellikleri (bağlantılar, paragraflar ve listeler) gösterir. + +## Yaygın kenar durumlarını ele alma + +### Eksik veya hatalı `href` öznitelikleri + +Bir `` etiketi geçerli bir `href` içermiyorsa, dönüştürücü bağlantı metnini URL olmadan ekler. Okunabilirliği korumak için Markdown'ı sonradan işlemek isteyebilirsiniz: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Büyük HTML dosyalarını dönüştürme + +Çok megabaytlık HTML dosyaları için, tüm işaretlemeyi belleğe yüklememek amacıyla girdiyi akış olarak işleyin: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Dönüştürme süreci kendisi değişmez, çünkü `HTMLDocument` kaynağın boyutunu soyutlar. + +## Alternatif biçimlendiriciler + +Git‑tarzı çıktı yerine düz CommonMark tercih ediyorsanız, biçimlendiriciyi değiştirin: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Bu, Git uzantılarını desteklemeyen platformları hedeflediğinizde faydalı olan daha minimal bir Markdown dosyası üretir. + +## Sonraki keşfedebileceğiniz ilgili görevler + +* **Markdown'ı tekrar HTML'ye dönüştür** – dokümantasyonu ön izlemek için faydalıdır. +* **HTML'yi PDF'ye dışa aktar** – başka bir yaygın **html to markdown conversion**‑ile ilişkili iş akışı. +* **HTML dosyaları içeren bir klasörü toplu işleyin** – dosyalar üzerinde döngü kurun ve aynı `MarkdownSaveOptions` örneğini yeniden kullanın. + +Bunların hepsi aynı modeli izler: bir kaynak belge oluşturun, kaydetme seçeneklerini yapılandırın ve `Converter.convert` çağrısını yapın. + +## Sonuç + +Artık Python'da **HTML'yi Markdown'a dönüştürmeyi**, **HTML'yi Markdown olarak kaydetmeyi** kesin özellik kontrolüyle ve doğru biçimlendiriciyi seçmenin sonraki araçlar için neden önemli olduğunu biliyorsunuz. Örnek, tek dize, dosya veya URL'ler için çalışan temiz, yeniden kullanılabilir bir yaklaşımı gösterir ve eksik bağlantılar ile büyük girdileri ele alma ipuçlarını içerir. + +Ek `MarkdownSaveOptions.Features` (ör. `IMAGE`, `TABLE`) ile çıktıyı projenizin ihtiyaçlarına göre özelleştirmekten çekinmeyin. Bu rehberi faydalı bulduysanız, ekip arkadaşlarınızla paylaşın veya proje dokümantasyonunuzda bağlantı verin. İyi dönüşümler! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/turkish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..648026ced5 --- /dev/null +++ b/html/turkish/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,215 @@ +--- +category: general +date: 2026-10-02 +description: Python'da SVG belgesi oluşturmayı, SVG'yi dosyaya kaydetmeyi ve kısa, + eksiksiz bir betikle SVG görüntüsünü dışa aktarmayı öğrenin. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: tr +lastmod: 2026-10-02 +og_description: Python'da SVG belgesi oluşturun ve bu pratik öğreticiyle SVG görüntüsünü + dışa aktarın. Komut dosyasını izleyin, SVG'yi dosyaya kaydedin ve vektör grafiğini + anında yeniden kullanın. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Python'da SVG belgesi oluşturma – adım adım rehber +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Python'da SVG belgesi oluşturma ve görüntü olarak dışa aktarma +url: /tr/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python'da SVG belgesi oluşturma ve görüntü olarak dışa aktarma + +Programlı olarak **SVG belgesi oluşturmanız** gerekiyorsa, bu öğretici Python ile bunu tam olarak nasıl yapacağınızı gösterir. Basit bir daire oluşturan, SVG'yi dosyaya kaydeden ve istediğiniz yere yerleştirebileceğiniz dışa aktarılabilir bir SVG görüntüsü üreten tam bir betik göreceksiniz. + +Koddan ölçeklenebilir vektör grafikleri üretmek, bir GUI editöründe şekil çizmeye harcanan manuel çabayı ortadan kaldırır. Bu rehberin sonunda SVG oluşturmayı veri görselleştirme boru hatlarına, otomatik rapor oluşturuculara veya keskin, çözünürlük‑bağımsız grafikler gerektiren herhangi bir projeye entegre edebilirsiniz. + +## Önkoşullar + +Başlamadan önce şunların yüklü olduğundan emin olun: + +- Python 3.8 veya daha yeni bir sürüm +- `svgwrite` kütüphanesi (`pip install svgwrite` ile kurulur) +- SVG'nin kaydedileceği dizine yazma izni + +Bu gereksinimler örneği hafif tutar ve çoğu ortamla uyumludur. + +## Adım 1: SVG kütüphanesini kurun ve içe aktarın + +İlk adım, SVG oluşturma için kullanışlı bir API sağlayan üçüncü‑taraf kütüphaneyi eklemektir. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite`, bir SVG dosyasının XML yapısını soyutlayarak ham işaretlemeden ziyade geometriye odaklanmanızı sağlar. + +## Adım 2: Bir SVG belge nesnesi oluşturun + +Şimdi `svgwrite.Drawing` örneği oluşturarak **SVG belgesi oluşturabilirsiniz**. Bu nesne kök `` öğesini temsil eder ve sonraki tüm şekilleri içinde tutar. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +`size` argümanı oluşturulan piksel boyutlarını tanımlarken, `viewBox` daha sonra tanımlayacağınız geometriyle eşleşen bir koordinat sistemi kurar. + +## Adım 3: Bir daire öğesi ekleyin + +Bir daire, merkez koordinatları (`cx`, `cy`) ve yarıçapı (`r`) ile tanımlanır. Bu öznitelikleri eklemek için `circle` yardımcı metodunu kullanın. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Daire, 100 × 100 tuvalin ortasında yer alır ve her iki tarafta 10 piksel boşluk bırakır. `fill` ve `stroke` değerlerini tasarım dilinize göre ayarlayın. + +## Adım 4: SVG'yi dosyaya kaydedin + +Grafik bir araya geldiğinde, `save` yöntemiyle **SVG'yi dosyaya kaydedebilirsiniz**. Bu, tarayıcıların ve vektör editörlerinin anlayabileceği iyi biçimlendirilmiş XML yazar. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +`circle.svg` dosyası artık geçerli çalışma dizininde bulunur. Bir web tarayıcısında, Inkscape'de veya SVG formatını destekleyen herhangi bir araçta açabilirsiniz. + +## Adım 5: Dışa aktarılan SVG görüntüsünü doğrulayın + +Kaydedilen dosyayı bir tarayıcıda açarak çıktıyı kontrol edin. Belirttiğiniz renklerle ortalanmış bir daire görmelisiniz. Ham XML şu şekildedir: + +```xml + + + + +``` + +SVG vektör tabanlı olduğundan, kalite kaybı olmadan ölçeklendirebilirsiniz; bu da duyarlı web tasarımları veya yüksek çözünürlüklü baskılar için idealdir. + +## Pro ipucu: SVG'yi PNG veya JPEG olarak dışa aktarın + +Raster bir sürüme ihtiyacınız varsa, **CairoSVG** gibi bir dönüşüm aracıyla SVG dosyasını birleştirin: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Bu adım, **SVG görüntüsünü** bir bitmap formatına dışa aktarmayı gösterir; alt sistemler doğrudan SVG render edemediğinde kullanışlıdır. + +## Yaygın varyasyonlar ve kenar durumları + +| Varyasyon | Nasıl ele alınır | +|-----------|-------------------| +| Birden fazla şekil | Her yeni öğe (rect, line, path) için `dwg.add()` çağırın. | +| Dinamik boyutlar | `Drawing` oluşturulmadan önce `size` ve `viewBox` değerlerini veriden hesaplayın. | +| Metin etiketleri | `dwg.text("Label", insert=("10", "20"))` kullanın ve `font_size` ile `fill` ile stil verin. | +| Belgeyi yeniden kullanma | `Drawing` nesnesini bellekte tutun ve gerektiğinde `save()` çağırarak güncellenmiş dosya oluşturun. | +| Büyük dosyalar | Bellek dalgalanmalarını önlemek için çıktıyı `dwg.tostring()` ile akışa alın ve manuel olarak bir dosya nesnesine yazın. | + +Bu senaryoları ele almak, **SVG oluşturma** betiğinizin basit ikonlardan karmaşık diyagramlara kadar ölçeklenmesini sağlar. + +## Tam betik özeti + +Aşağıda, tüm adımları ve isteğe bağlı dönüşümü içeren çalıştırılabilir tam örnek yer alıyor: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Bu betiği çalıştırdığınızda `circle.svg` ve `cairosvg` kuruluysa `circle.png` oluşturulur. Her iki dosya da web sayfalarına, raporlara veya daha ileri işleme dahil edilmeye hazırdır. + +## Sonuç + +Artık Python'da **SVG belgesi oluşturma**, **SVG'yi dosyaya kaydetme** ve **SVG görüntüsünü dışa aktarma** konularını biliyorsunuz. Örnek, temel API çağrılarını kapsar, her adımın neden önemli olduğunu açıklar ve daha karmaşık grafikler için genişletmeler sunar. + +Sonraki adımda, yollar çizmeyi, degrade uygulamayı ve öğeleri animasyonlu hale getirmeyi içeren ek **SVG Python öğreticileri** keşfedin. Bu teknikleri entegre ederek Python uygulamalarınızdan doğrudan dinamik, veri‑odaklı vektör grafikler üretebileceksiniz. İyi kodlamalar! + +## Sonra Ne Öğrenmelisiniz? + +Aşağıdaki öğreticiler, bu kılavuzda gösterilen tekniklere dayanan ilgili konuları kapsar. Her kaynak, ek API özelliklerini ustalaşmanız ve projelerinizde alternatif uygulama yaklaşımları keşfetmeniz için adım‑adım açıklamalı tam çalışan kod örnekleri içerir. + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/turkish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..8620be0d39 --- /dev/null +++ b/html/turkish/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,237 @@ +--- +category: general +date: 2026-10-02 +description: HtmlSaveOptions ve akış kullanarak Python’da HTML belgesini nasıl yükleyeceğinizi + ve büyük HTML dosyalarını verimli bir şekilde işleyeceğinizi öğrenin. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: tr +lastmod: 2026-10-02 +og_description: HtmlSaveOptions ve akış kullanarak Python'da HTML belgesini yükleyin. + Bu öğretici, büyük HTML dosyaları için eksiksiz, doğrudan çalıştırılabilir bir çözüm + sunar. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Python'da akışla HTML belgesi yükleme – adım adım rehber +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Python'da akışla HTML belgesi nasıl yüklenir +url: /tr/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python'da akış (streaming) ile html belgesi nasıl yüklenir + +Eğer birkaç yüz megabayt ya da daha büyük **html belgesini yükleme** dosyalarına ihtiyacınız varsa, kısa sürede bellek kullanım sorunlarıyla karşılaşırsınız. Bu kılavuz, **HTML streaming** kullanarak bellek tüketimini düşük tutan ve yine de belgenin içeriğine tam erişim sağlayan eksiksiz, hazır bir çözüm gösterir. + +`HtmlSaveOptions` yapılandırmasını, akışı (streaming) etkinleştirmeyi ve işlenmiş dosyayı kaydetmeyi üç kısa adımda öğreneceksiniz. Standart `aspose.html` Python paketi dışındaki hiçbir harici araç gerekmez; bu yaklaşım toplu işler, sunucu‑tarafı işlem hatları veya **large HTML files** ile çalışan yerel betikler için idealdir. + +## Önkoşullar + +* Python 3.8 veya daha yeni bir sürüm yüklü. +* `aspose.html` kütüphanesi (`pip install aspose-html`) – bu, `HTMLDocument` ve `HtmlSaveOptions` sağlar. +* Çalışmak istediğiniz büyük HTML dosyasını içeren bir dizin (örnek: `large.html`). + +Bu gereksinimler minimaldir, böylece bir HTML belgesini verimli bir şekilde yüklemenin temel mantığına odaklanabilirsiniz. + +## Adım 1: HTML belgesini yükle + +İlk işlem, kaynak dosyaya işaret eden bir `HTMLDocument` örneği oluşturmaktır. Bu nesne **html belgesini yükleme** işlemini temsil eder ve işaretlemeyi tembel (lazy) bir şekilde ayrıştırır; bu, büyük dosyaları işlemek için esastır. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Neden önemli?** +`HTMLDocument` nesnesi oluşturulduğunda dosyanın tamamı hemen belleğe okunmaz. Bunun yerine, gerektiğinde diskteki veriyi çeken bir akış (streaming) ayrıştırıcı hazırlanır. Bu tasarım, makinenizin RAM'ini aşan dosyalarla çalışmanıza olanak tanır. + +## Adım 2: HtmlSaveOptions ile akışı etkinleştir + +Belgeyi değiştirirken veya kaydederken bellek ayak izini düşük tutmak için `HtmlSaveOptions` üzerinde akış modunu etkinleştirmeniz gerekir. Bu ikincil anahtar kelime, **HtmlSaveOptions**, kütüphanenin çıktı dosyasını nasıl yazdığını kontrol eder. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Neden akışı etkinleştiriyorsunuz?** +`enable_streaming` `True` olarak ayarlandığında, kütüphane çıktıyı bellekte tüm sonucu tamponlamadan parçalar halinde yazar. Bu, daha sonra **belgeyi kaydettiğinizde** veya **large HTML files** üzerinde dönüşümler yaptığınızda kritik öneme sahiptir. + +## Adım 3: Yapılandırılmış seçeneklerle belgeyi kaydet + +Artık akış etkin olduğuna göre, işlenmiş içeriği güvenle yeni bir dosyaya yazabilirsiniz. `save` yöntemi, yapılandırdığımız `HtmlSaveOptions` değerlerine uyar ve işlemin bellek‑verimli kalmasını sağlar. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Arka planda ne olur:** +`save` çağrısı HTML işaretlemesini `large_out.html` dosyasına parça parça akıtır. Belge, akış ayrıştırıcı ile yüklendiği için, yüklemeden kaydetmeye kadar tüm işlem hattı sabit ve düşük bellek kullanımıyla çalışır. + +## Tam çalışan örnek + +Üç adımı birleştirerek, komut satırından doğrudan çalıştırabileceğiniz kompakt bir betik elde edersiniz: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Beklenen çıktı** + +Betik (`python load_html_document_streaming.py`) çalıştırdığınızda şu çıktıyı görmelisiniz: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +`large_out.html` dosyası, orijinalin eksiksiz bir kopyası olacaktır, ancak tüm dosya RAM'e yüklenmeden işlenmiştir. + +## Yaygın sorular ve uç‑durum yönetimi + +### Bu, harici kaynaklar (görseller, CSS, betikler) içeren HTML dosyalarıyla çalışır mı? + +Evet. Akış ayrıştırıcı, harici referansları sıradan öznitelikler olarak ele alır. Kaynakları **indirmez**, siz açıkça talep etmediğiniz sürece. Bu kaynakları gömmek isterseniz, belge yüklendikten sonra `aspose.html`'den ek API'ler kullanabilirsiniz. + +### Kaynak dosya bozuk veya düzgün biçimlendirilmemiş HTML ise ne olur? + +`HTMLDocument` küçük hatalardan kurtulmaya çalışır, ancak ciddi bozulmalar bir istisna fırlatır. Bu durumları nazikçe ele almak için yükleme adımını bir `try/except` bloğuna sarın: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Kaydetmeden önce DOM'u değiştirebilir miyim? + +Kesinlikle. Yüklemeden sonra DOM ağacına (`html_doc.dom`) tam erişiminiz olur. Düğümler ekleyebilir, öğeleri kaldırabilir veya öznitelikleri değiştirebilir, ardından akış hâlâ etkin iken `save` çağırabilirsiniz. Değişiklikler adım adım uygulandığı için bellek kullanımı düşük kalır. + +### Akış (streaming) çıktı kalitesini etkiler mi? + +Hayır. Akışla üretilen çıktı, DOM değişikliği yapmadığınız sürece, akışsız kaydetme ile elde edeceğiniz çıktıyla bayt‑bayt aynı olur. Akış sadece verinin nasıl yazıldığını değiştirir, neyin yazıldığını değil. + +## Performans ipucu: bellek kullanımını ölç + +Akışın gerçekten bellek tüketimini azalttığını doğrulamak istiyorsanız, `psutil` kütüphanesini kullanabilirsiniz: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +500 MB HTML dosyaları için bile genellikle sadece birkaç megabayt RAM kullanımını görürsünüz. + +## Sonuç + +Bu öğreticide, Python'da **html belgesini yükleme** işlemini verimli bir şekilde nasıl yapacağınızı öğrendiniz: + +1. Dosyayı tembel (lazy) ayrıştırmak için `HTMLDocument` örneği oluşturmak. +2. Düşük‑bellekli yazmalar için `enable_streaming = True` ile `HtmlSaveOptions` yapılandırması. +3. Çıktıyı diske akıtarak belgeyi kaydetmek. + +Bu üç adım, **large HTML files**'ı **Python HTML processing** teknikleriyle işlemek için sağlam bir desen sunar. Bundan sonra betiği DOM'u değiştirmek, veri çıkarmak veya onlarca dosyayı toplu işlemek için genişletebilirsiniz—bellek kullanımını öngörülebilir tutarak. + +**Sonraki adımlar** + +* `aspose.html` DOM API'sini keşfederek tablolar, bağlantılar veya görselleri çıkarın. +* Bu yaklaşımı çoklu iş parçacığı (multithreading) ile birleştirerek birden fazla dosyayı paralel işleyin. +* Karakter kodlamasını veya diğer ayrıştırma nüanslarını kontrol etmeniz gerekiyorsa `HtmlLoadOptions`'a bakın. + +İyi kodlamalar, ve ölçekli **html belgesini yükleme** işlemini bellek‑dostu bir şekilde deneyimleyin! + +## Sonraki Öğrenmeniz Gerekenler + +Aşağıdaki öğreticiler, bu rehberde gösterilen tekniklere dayanan yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini öğrenmenize ve kendi projelerinizde alternatif uygulama yaklaşımlarını keşfetmenize yardımcı olmak için adım adım açıklamalı tam çalışan kod örnekleri içerir. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md b/html/vietnamese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md new file mode 100644 index 0000000000..e3eabf805c --- /dev/null +++ b/html/vietnamese/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/_index.md @@ -0,0 +1,249 @@ +--- +category: general +date: 2026-10-02 +description: Chuyển đổi HTML sang Markdown trong Python với một ví dụ đầy đủ. Tìm + hiểu cách lưu HTML dưới dạng Markdown, chọn bộ định dạng và bật các tính năng cụ + thể. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: vi +lastmod: 2026-10-02 +og_description: Chuyển đổi HTML sang Markdown trong Python với mã thực tế, các tùy + chọn định dạng và cờ tính năng. Hãy làm theo hướng dẫn này để lưu HTML thành Markdown + nhanh chóng. +og_image_alt: Screenshot of Python code converting HTML to Markdown +og_title: Chuyển đổi HTML sang Markdown trong Python – hướng dẫn đầy đủ +schemas: +- author: GroupDocs + dateModified: '2026-10-02' + description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + headline: How to convert HTML to Markdown in Python – step‑by‑step guide + type: TechArticle +- description: convert HTML to Markdown in Python with a complete example. Learn how + to save HTML as Markdown, choose formatters, and enable specific features. + name: How to convert HTML to Markdown in Python – step‑by‑step guide + steps: + - name: Enabling only the needed features + text: You can fine‑tune the output by turning on specific feature flags. In this + example we keep **links** and **paragraphs** while disabling images, tables, + and other constructs. + - name: Expected output (`output.md`) + text: '```markdown # Project Overview' + - name: Missing or malformed `href` attributes + text: 'If an `` tag lacks a valid `href`, the converter inserts the link text + without a URL. To preserve readability, you may want to post‑process the Markdown:' + - name: Converting large HTML files + text: 'For multi‑megabyte HTML files, stream the input to avoid loading the entire + markup into memory:' + type: HowTo +tags: +- HTML +- Markdown +- Python +title: Cách chuyển đổi HTML sang Markdown trong Python – hướng dẫn từng bước +url: /vi/python/general/how-to-convert-html-to-markdown-in-python-step-by-step-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách chuyển đổi HTML sang Markdown trong Python – hướng dẫn từng bước + +Nếu bạn cần **chuyển đổi HTML sang Markdown**, hướng dẫn này sẽ cho bạn một giải pháp hoàn chỉnh, có thể chạy được trong Python. Bạn sẽ thấy cách **lưu HTML dưới dạng Markdown**, chọn bộ định dạng phù hợp, và bật chỉ những tính năng bạn cần. + +Việc chuyển đổi HTML sang Markdown là một nhiệm vụ phổ biến khi bạn muốn tài liệu nhẹ, nội dung cho trang tĩnh, hoặc các tệp văn bản được kiểm soát phiên bản. Bài học này bao phủ mọi thứ từ cài đặt thư viện đến xử lý các trường hợp đặc biệt, để bạn có thể áp dụng kỹ thuật này cho bất kỳ nguồn HTML nào. + +## Các yêu cầu trước + +Trước khi bắt đầu, hãy chắc chắn rằng bạn có: + +* Python 3.8 trở lên đã được cài đặt. +* Quyền truy cập `pip` để cài đặt các gói bên thứ ba. +* Kiến thức cơ bản về thẻ HTML và cú pháp Markdown. + +Không cần bất kỳ phụ thuộc hệ thống nào khác vì thư viện chuyển đổi được viết hoàn toàn bằng Python. + +## Cài đặt thư viện GroupDocs Conversion + +Mẫu mã sử dụng gói Python **GroupDocs.Conversion**, cung cấp `HTMLDocument`, `MarkdownSaveOptions`, và `Converter`. Cài đặt bằng lệnh: + +```bash +pip install groupdocs-conversion +``` + +> **Pro tip:** Sử dụng môi trường ảo (`python -m venv venv`) để giữ gói tách biệt với các dự án khác. + +## Bước 1: Tạo một `HTMLDocument` từ chuỗi + +Bước đầu tiên là bọc HTML thô của bạn trong một thể hiện `HTMLDocument`. Đối tượng này trừu tượng hoá nguồn, cho dù nó đến từ chuỗi, tệp, hay URL từ xa. + +```python +from groupdocs.conversion import HTMLDocument + +# Example HTML – you can replace this with any valid markup +html_content = "

Title

Hello world

" +html_doc = HTMLDocument(html_content) +``` + +*Lý do quan trọng:* `HTMLDocument` phân tích markup một lần, cho phép bộ chuyển đổi làm việc với một biểu diễn đã chuẩn hoá thay vì văn bản thô. + +## Bước 2: Cấu hình `MarkdownSaveOptions` + +`MarkdownSaveOptions` cho phép bạn kiểm soát định dạng đầu ra và những tính năng Markdown nào sẽ được xuất. Thư viện hỗ trợ hai bộ định dạng: + +* **DEFAULT** – Markdown tiêu chuẩn tương thích CommonMark. +* **GIT** – Git‑flavored Markdown (thêm bảng, gạch ngang, v.v.). + +Đối với hầu hết các kịch bản kiểm soát phiên bản, bộ định dạng **GIT** được ưu tiên. + +```python +from groupdocs.conversion import MarkdownSaveOptions + +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT +``` + +### Bật chỉ những tính năng cần thiết + +Bạn có thể tinh chỉnh đầu ra bằng cách bật các cờ tính năng cụ thể. Trong ví dụ này chúng ta giữ **liên kết** và **đoạn văn** trong khi tắt hình ảnh, bảng và các cấu trúc khác. + +```python +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH +) +``` + +*Lý do quan trọng:* Giới hạn tính năng giảm kích thước tệp tạo ra và ngăn ngừa các phần tử Markdown không mong muốn mà các công cụ phía sau có thể không hỗ trợ. + +## Bước 3: Chuyển đổi tài liệu + +Với `HTMLDocument` nguồn và `MarkdownSaveOptions` đã cấu hình, việc chuyển đổi chỉ là một lời gọi tới `Converter.convert`. Cung cấp đường dẫn tuyệt đối hoặc tương đối cho tệp đầu ra. + +```python +from groupdocs.conversion import Converter + +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) +``` + +Sau khi lời gọi hoàn tất, `output.md` sẽ chứa biểu diễn Markdown của HTML gốc. + +## Kịch bản đầy đủ bạn có thể chạy ngay hôm nay + +Dưới đây là script hoàn chỉnh, tự chứa, kết hợp tất cả các bước trước. Lưu lại dưới tên `html_to_md.py` và chạy `python html_to_md.py`. + +```python +# html_to_md.py +# Complete example that converts HTML to Markdown using GroupDocs.Conversion + +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# 1️⃣ Create the HTMLDocument – replace the string with your own HTML source +html_content = """ +

Project Overview

+

Welcome to the example repo.

+
    +
  • Feature A
  • +
  • Feature B
  • +
+""" +html_doc = HTMLDocument(html_content) + +# 2️⃣ Prepare Markdown save options +md_opts = MarkdownSaveOptions() +md_opts.formatter = MarkdownSaveOptions.Formatter.GIT # Git‑flavored Markdown +md_opts.features = ( + MarkdownSaveOptions.Features.LINK | + MarkdownSaveOptions.Features.PARAGRAPH | + MarkdownSaveOptions.Features.LIST # include lists for this example +) + +# 3️⃣ Perform the conversion +output_path = "output.md" +Converter.convert(html_doc, output_path, md_opts) + +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +### Đầu ra dự kiến (`output.md`) + +```markdown +# Project Overview + +Welcome to the [example repo](https://github.com/example). + +- Feature A +- Feature B +``` + +Đầu ra khớp với cấu trúc HTML gốc trong khi chỉ hiển thị các tính năng chúng ta đã bật (liên kết, đoạn văn và danh sách). + +## Xử lý các trường hợp đặc biệt thường gặp + +### Thuộc tính `href` thiếu hoặc sai dạng + +Nếu thẻ `` không có `href` hợp lệ, bộ chuyển đổi sẽ chèn chỉ văn bản liên kết mà không có URL. Để duy trì tính đọc được, bạn có thể muốn xử lý hậu kỳ Markdown: + +```python +import re + +def fix_broken_links(md_text): + # Replace stray brackets like [text]() with just the text + return re.sub(r'\[([^\]]+)\]\(\)', r'\1', md_text) + +with open(output_path, "r+", encoding="utf-8") as f: + content = f.read() + f.seek(0) + f.write(fix_broken_links(content)) + f.truncate() +``` + +### Chuyển đổi các tệp HTML lớn + +Đối với các tệp HTML có kích thước đa megabyte, hãy stream đầu vào để tránh tải toàn bộ markup vào bộ nhớ: + +```python +with open("large_input.html", "r", encoding="utf-8") as src: + html_doc = HTMLDocument(src.read()) +``` + +Quá trình chuyển đổi vẫn không thay đổi vì `HTMLDocument` trừu tượng hoá kích thước nguồn. + +## Các bộ định dạng thay thế + +Nếu bạn muốn CommonMark thuần túy thay vì đầu ra kiểu Git, hãy chuyển bộ định dạng: + +```python +md_opts.formatter = MarkdownSaveOptions.Formatter.DEFAULT +``` + +Điều này sẽ tạo ra một tệp Markdown tối giản hơn, hữu ích khi bạn nhắm tới các nền tảng không hỗ trợ các mở rộng của Git. + +## Các nhiệm vụ liên quan bạn có thể khám phá tiếp + +* **Chuyển đổi Markdown lại thành HTML** – hữu ích để xem trước tài liệu. +* **Xuất HTML sang PDF** – một quy trình làm việc thường gặp liên quan tới **html to markdown conversion**. +* **Xử lý hàng loạt một thư mục các tệp HTML** – lặp qua các tệp và tái sử dụng cùng một thể hiện `MarkdownSaveOptions`. + +Tất cả những việc này đều theo cùng một mẫu: tạo tài liệu nguồn, cấu hình tùy chọn lưu, và gọi `Converter.convert`. + +## Kết luận + +Bây giờ bạn đã biết cách **chuyển đổi HTML sang Markdown** trong Python, cách **lưu HTML dưới dạng Markdown** với kiểm soát tính năng chính xác, và tại sao việc chọn bộ định dạng phù hợp lại quan trọng đối với các công cụ phía sau. Ví dụ minh họa một cách tiếp cận sạch sẽ, có thể tái sử dụng cho chuỗi, tệp hoặc URL, và bao gồm các mẹo xử lý liên kết thiếu và đầu vào lớn. + +Hãy thoải mái thử nghiệm thêm `MarkdownSaveOptions.Features` (ví dụ: `IMAGE`, `TABLE`) để tùy chỉnh đầu ra cho nhu cầu dự án của bạn. Nếu bạn thấy hướng dẫn này hữu ích, hãy chia sẻ với đồng nghiệp hoặc liên kết tới nó trong tài liệu dự án. Chúc bạn chuyển đổi thành công! + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md b/html/vietnamese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md new file mode 100644 index 0000000000..96b1916c15 --- /dev/null +++ b/html/vietnamese/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/_index.md @@ -0,0 +1,211 @@ +--- +category: general +date: 2026-10-02 +description: Tìm hiểu cách tạo tài liệu SVG trong Python, lưu SVG vào tệp và xuất + hình ảnh SVG bằng một đoạn mã ngắn, đầy đủ. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create SVG document +- save SVG to file +- how to generate SVG +- export SVG image +- SVG Python tutorial +language: vi +lastmod: 2026-10-02 +og_description: Tạo tài liệu SVG trong Python và xuất hình ảnh SVG với hướng dẫn thực + tế này. Theo dõi kịch bản, lưu SVG vào tệp và sử dụng lại đồ họa vector ngay lập + tức. +og_image_alt: Screenshot of a Python script that creates an SVG document +og_title: Tạo tài liệu SVG trong Python – hướng dẫn từng bước +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to create SVG document in Python, save SVG to file, and export + SVG image with a short, complete script. + headline: How to create SVG document and export it as an image in Python + type: TechArticle +tags: +- SVG +- Python +- graphics +title: Cách tạo tài liệu SVG và xuất nó dưới dạng hình ảnh trong Python +url: /vi/python/general/how-to-create-svg-document-and-export-it-as-an-image-in-pyth/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách tạo tài liệu SVG và xuất nó thành hình ảnh trong Python + +Nếu bạn cần **create SVG document** một cách lập trình, hướng dẫn này sẽ chỉ cho bạn cách thực hiện bằng Python. Bạn sẽ thấy một script hoàn chỉnh tạo một vòng tròn đơn giản, lưu SVG vào tệp và tạo ra một hình ảnh SVG có thể xuất ra để nhúng ở bất kỳ đâu. + +Việc tạo đồ họa vector có thể mở rộng từ mã nguồn loại bỏ công việc vẽ thủ công trong trình chỉnh sửa GUI. Khi kết thúc hướng dẫn này, bạn có thể tích hợp việc tạo SVG vào các pipeline trực quan hoá dữ liệu, trình tạo báo cáo tự động, hoặc bất kỳ dự án nào cần đồ họa sắc nét, độc lập độ phân giải. + +## Yêu cầu trước + +- Python 3.8 hoặc mới hơn đã được cài đặt +- Thư viện `svgwrite` (cài đặt bằng `pip install svgwrite`) +- Quyền ghi vào thư mục nơi SVG sẽ được lưu + +Các yêu cầu này giúp ví dụ nhẹ và tương thích với hầu hết các môi trường. + +## Bước 1: Cài đặt và import thư viện SVG + +Bước đầu tiên là thêm thư viện bên thứ ba cung cấp API tiện lợi cho việc tạo SVG. + +```python +# Install the library (run once in your terminal) +# pip install svgwrite + +import svgwrite # Provides the SVGDocument class and element helpers +``` + +`svgwrite` trừu tượng hoá cấu trúc XML của tệp SVG, cho phép bạn tập trung vào hình học thay vì markup thô. + +## Bước 2: Tạo đối tượng tài liệu SVG + +Bây giờ bạn có thể **create SVG document** bằng cách khởi tạo `svgwrite.Drawing`. Đối tượng này đại diện cho phần tử gốc `` và chứa tất cả các hình dạng tiếp theo. + +```python +# Step 2: Initialize the SVG document +dwg = svgwrite.Drawing( + filename="circle.svg", # Desired output file name + size=("100px", "100px"), # Width and height of the canvas + viewBox=("0 0 100 100") # Coordinate system for drawing +) +``` + +Tham số `size` xác định kích thước pixel khi render, trong khi `viewBox` thiết lập hệ tọa độ phù hợp với hình học bạn sẽ định nghĩa sau. + +## Bước 3: Thêm phần tử vòng tròn + +Một vòng tròn được định nghĩa bởi tâm (`cx`, `cy`) và bán kính (`r`). Sử dụng hàm trợ giúp `circle` để gán các thuộc tính này. + +```python +# Step 3: Create a element +circle = dwg.circle( + center=("50", "50"), # cx = 50, cy = 50 + r="40", # radius = 40 + fill="lightcoral", # Fill color for visual clarity + stroke="black", # Outline color + stroke_width="2" +) + +# Append the circle to the SVG root +dwg.add(circle) +``` + +Vòng tròn nằm ở giữa canvas 100 × 100, để lại lề 10 pixel ở mỗi phía. Điều chỉnh `fill` và `stroke` để phù hợp với ngôn ngữ thiết kế của bạn. + +## Bước 4: Lưu SVG vào tệp + +Sau khi đồ họa được lắp ráp, bạn có thể **save SVG to file** bằng phương thức `save`. Điều này ghi ra XML chuẩn mà trình duyệt và trình chỉnh sửa vector hiểu. + +```python +# Step 4: Persist the SVG document +dwg.save() +print("SVG file saved as circle.svg") +``` + +Tệp `circle.svg` hiện đã nằm trong thư mục làm việc hiện tại. Bạn có thể mở nó trong trình duyệt web, Inkscape, hoặc bất kỳ công cụ nào hỗ trợ định dạng SVG. + +## Bước 5: Xác minh hình ảnh SVG đã xuất + +Mở tệp đã lưu trong trình duyệt để xác nhận kết quả. Bạn sẽ thấy một vòng tròn ở trung tâm với các màu đã chỉ định. XML thô trông như sau: + +```xml + + + + +``` + +Vì SVG dựa trên vector, bạn có thể phóng to hình ảnh mà không mất chất lượng, làm cho nó lý tưởng cho thiết kế web đáp ứng hoặc in ấn độ phân giải cao. + +## Mẹo chuyên nghiệp: Xuất SVG thành PNG hoặc JPEG + +Nếu bạn cần phiên bản raster, kết hợp tệp SVG với công cụ chuyển đổi như **CairoSVG**: + +```python +# Optional: Convert SVG to PNG +# pip install cairosvg +import cairosvg + +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +Bước này minh họa **export SVG image** sang định dạng bitmap, hữu ích khi các hệ thống downstream không thể render SVG trực tiếp. + +## Các biến thể phổ biến và trường hợp đặc biệt + +| Variation | How to handle | +|-----------|---------------| +| Nhiều hình dạng | Gọi `dwg.add()` cho mỗi phần tử mới (rect, line, path). | +| Kích thước động | Tính toán `size` và `viewBox` từ dữ liệu trước khi tạo `Drawing`. | +| Nhãn văn bản | Sử dụng `dwg.text("Label", insert=("10", "20"))` và định dạng bằng `font_size` và `fill`. | +| Tái sử dụng tài liệu | Giữ đối tượng `Drawing` trong bộ nhớ và gọi `save()` mỗi khi bạn cần một tệp cập nhật. | +| Tệp lớn | Phát luồng đầu ra bằng `dwg.tostring()` và ghi vào đối tượng tệp một cách thủ công để tránh tăng đột biến bộ nhớ. | + +Việc xử lý các kịch bản này đảm bảo script **how to generate SVG** của bạn mở rộng từ các biểu tượng đơn giản đến các sơ đồ phức tạp. + +## Tóm tắt toàn bộ script + +Dưới đây là ví dụ đầy đủ, có thể chạy được, bao gồm tất cả các bước và chuyển đổi tùy chọn: + +```python +# Full SVG creation script – create SVG document, save SVG to file, export SVG image +import svgwrite +import cairosvg # Optional, only needed for PNG conversion + +# Initialize the drawing (SVG document) +dwg = svgwrite.Drawing( + filename="circle.svg", + size=("100px", "100px"), + viewBox=("0 0 100 100") +) + +# Define a circle element +circle = dwg.circle( + center=("50", "50"), + r="40", + fill="lightcoral", + stroke="black", + stroke_width="2" +) + +# Add the circle to the document +dwg.add(circle) + +# Save the SVG file +dwg.save() +print("SVG file saved as circle.svg") + +# Optional: convert SVG to PNG (export SVG image) +cairosvg.svg2png(url="circle.svg", write_to="circle.png") +print("PNG version saved as circle.png") +``` + +## Kết luận + +Bây giờ bạn đã biết cách **create SVG document** trong Python, **save SVG to file**, và **export SVG image** để sử dụng rộng rãi hơn. Ví dụ này bao gồm các lời gọi API thiết yếu, giải thích lý do mỗi bước quan trọng, và cung cấp các mở rộng cho đồ họa phức tạp hơn. + +Tiếp theo, khám phá các chủ đề **SVG Python tutorial** bổ sung như vẽ đường dẫn, áp dụng gradient, và tạo hoạt ảnh cho các phần tử. Kết hợp những kỹ thuật này sẽ cho phép bạn tạo đồ họa vector động, dựa trên dữ liệu trực tiếp từ các ứng dụng Python của mình. Chúc lập trình vui vẻ! + +## Bạn Nên Học Gì Tiếp Theo? + +Các hướng dẫn sau đây bao gồm các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật được trình bày trong hướng dẫn này. Mỗi tài nguyên bao gồm các ví dụ mã hoạt động đầy đủ với giải thích từng bước để giúp bạn nắm vững các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md b/html/vietnamese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md new file mode 100644 index 0000000000..49863d3108 --- /dev/null +++ b/html/vietnamese/python/general/how-to-load-html-document-with-streaming-in-python/_index.md @@ -0,0 +1,239 @@ +--- +category: general +date: 2026-10-02 +description: Tìm hiểu cách tải tài liệu HTML trong Python bằng HtmlSaveOptions và + streaming để xử lý các tệp HTML lớn một cách hiệu quả. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- load html document +- HTML streaming +- HtmlSaveOptions +- large HTML files +- Python HTML processing +language: vi +lastmod: 2026-10-02 +og_description: Tải tài liệu HTML trong Python bằng HtmlSaveOptions và streaming. + Hướng dẫn này trình bày một giải pháp hoàn chỉnh, sẵn sàng chạy cho các tệp HTML + lớn. +og_image_alt: Diagram showing load html document using streaming in Python +og_title: Tải tài liệu HTML bằng streaming trong Python – hướng dẫn từng bước +schemas: +- author: Aspose + dateModified: '2026-10-02' + description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + headline: How to load html document with streaming in Python + type: TechArticle +- description: Learn how to load html document in Python with HtmlSaveOptions and + streaming to process large html files efficiently. + name: How to load html document with streaming in Python + steps: + - name: Does this work with HTML files that contain external resources (images, + CSS, scripts)? + text: Yes. The streaming parser treats external references as ordinary attributes. + It does **not** download the resources unless you explicitly request them. If + you need to embed those resources, you can use additional APIs from `aspose.html` + after the document is loaded. + - name: What if the source file is corrupted or not well‑formed HTML? + text: '`HTMLDocument` will attempt to recover from minor errors, but severe malformations + raise an exception. Wrap the load step in a `try/except` block to handle such + cases gracefully:' + - name: Can I modify the DOM before saving? + text: Absolutely. After loading, you have full access to the DOM tree (`html_doc.dom`). + You can insert nodes, remove elements, or alter attributes, and then call `save` + with streaming still enabled. The memory usage will stay low because changes + are applied incrementally. + - name: Does streaming affect the output quality? + text: No. The streamed output is byte‑for‑byte identical to what you would get + from a non‑streaming save, assuming you haven’t made any DOM modifications. + Streaming only changes how the data is written, not what is written. + type: HowTo +tags: +- HTML +- Python +- file handling +- streaming +title: Cách tải tài liệu HTML bằng streaming trong Python +url: /vi/python/general/how-to-load-html-document-with-streaming-in-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách tải tài liệu html bằng streaming trong Python + +Nếu bạn cần **tải tài liệu html** có kích thước hàng trăm megabyte hoặc lớn hơn, bạn sẽ nhanh chóng gặp phải vấn đề về sử dụng bộ nhớ. Hướng dẫn này cung cấp cho bạn một giải pháp hoàn chỉnh, sẵn sàng chạy, sử dụng **HTML streaming** để giữ mức tiêu thụ bộ nhớ thấp đồng thời vẫn cho phép bạn truy cập đầy đủ nội dung của tài liệu. + +Bạn sẽ học cách cấu hình `HtmlSaveOptions`, bật streaming và lưu tệp đã xử lý — tất cả chỉ trong ba bước ngắn gọn. Không cần công cụ bên ngoài nào ngoài gói `aspose.html` chuẩn cho Python, làm cho cách tiếp cận này lý tưởng cho các công việc batch, pipeline phía server, hoặc script cục bộ xử lý **các tệp HTML lớn**. + +## Prerequisites + +Trước khi bắt đầu, hãy chắc chắn rằng bạn đã có: + +* Python 3.8 trở lên đã được cài đặt. +* Thư viện `aspose.html` (`pip install aspose-html`) – cung cấp `HTMLDocument` và `HtmlSaveOptions`. +* Một thư mục chứa tệp HTML lớn mà bạn muốn làm việc (ví dụ: `large.html`). + +Các yêu cầu này rất tối thiểu, vì vậy bạn có thể tập trung vào logic cốt lõi của việc tải tài liệu HTML một cách hiệu quả. + +## Bước 1: Tải tài liệu HTML + +Hoạt động đầu tiên là tạo một thể hiện `HTMLDocument` trỏ tới tệp nguồn. Đối tượng này đại diện cho thao tác **load html document** và phân tích cú pháp một cách lười biếng, điều này rất quan trọng khi xử lý các tệp lớn. + +```python +from aspose.html import HTMLDocument + +# Replace with the actual path to your large HTML file +html_path = "YOUR_DIRECTORY/large.html" + +# Load the HTML document from disk +html_doc = HTMLDocument(html_path) +``` + +**Tại sao lại quan trọng:** +Việc tạo đối tượng `HTMLDocument` không đọc toàn bộ tệp vào bộ nhớ ngay lập tức. Thay vào đó, nó chuẩn bị một parser streaming sẽ kéo dữ liệu từ đĩa khi cần. Thiết kế này cho phép bạn làm việc với các tệp vượt quá RAM của máy. + +## Bước 2: Bật streaming với HtmlSaveOptions + +Để giữ dấu chân bộ nhớ thấp khi bạn thao tác hoặc lưu tài liệu, bạn phải bật chế độ streaming trên `HtmlSaveOptions`. Từ khóa phụ này, **HtmlSaveOptions**, kiểm soát cách thư viện ghi tệp đầu ra. + +```python +from aspose.html import HtmlSaveOptions + +# Configure save options for streaming +save_opts = HtmlSaveOptions() +save_opts.enable_streaming = True # Turn on streaming mode +``` + +**Tại sao phải bật streaming?** +Khi `enable_streaming` được đặt thành `True`, thư viện ghi đầu ra thành các khối thay vì lưu trữ toàn bộ kết quả trong bộ nhớ. Điều này rất quan trọng khi bạn sau này **save the document** hoặc thực hiện các biến đổi trên **large HTML files**. + +## Bước 3: Lưu tài liệu với các tùy chọn đã cấu hình + +Bây giờ streaming đã được kích hoạt, bạn có thể an toàn ghi nội dung đã xử lý vào một tệp mới. Phương thức `save` sẽ tuân theo `HtmlSaveOptions` mà chúng ta đã cấu hình, đảm bảo hoạt động vẫn tiết kiệm bộ nhớ. + +```python +# Destination path for the streamed output +output_path = "YOUR_DIRECTORY/large_out.html" + +# Save the document using the streaming options +html_doc.save(output_path, save_opts) +``` + +**Điều gì xảy ra phía sau:** +Lệnh `save` stream markup HTML tới `large_out.html` từng phần một. Vì tài liệu đã được tải bằng parser streaming, toàn bộ pipeline — từ load đến save — hoạt động với mức sử dụng bộ nhớ không đổi và thấp. + +## Ví dụ làm việc đầy đủ + +Kết hợp ba bước lại với nhau sẽ cho bạn một script ngắn gọn có thể chạy trực tiếp từ dòng lệnh: + +```python +# load_html_document_streaming.py +from aspose.html import HTMLDocument, HtmlSaveOptions + +def main(): + # Path to the source HTML file (must exist) + source_file = "YOUR_DIRECTORY/large.html" + # Path where the streamed output will be written + destination_file = "YOUR_DIRECTORY/large_out.html" + + # Step 1: Load the HTML document + html_doc = HTMLDocument(source_file) + + # Step 2: Enable streaming via HtmlSaveOptions + save_opts = HtmlSaveOptions() + save_opts.enable_streaming = True + + # Step 3: Save the document using streaming + html_doc.save(destination_file, save_opts) + + print(f"Successfully loaded html document and saved streamed output to '{destination_file}'.") + +if __name__ == "__main__": + main() +``` + +**Kết quả mong đợi** + +Khi bạn chạy script (`python load_html_document_streaming.py`), bạn sẽ thấy: + +``` +Successfully loaded html document and saved streamed output to 'YOUR_DIRECTORY/large_out.html'. +``` + +Tệp `large_out.html` sẽ là bản sao trung thực của tệp gốc, nhưng đã được xử lý mà không bao giờ tải toàn bộ tệp vào RAM. + +## Các câu hỏi thường gặp và xử lý các trường hợp đặc biệt + +### Có hoạt động được với các tệp HTML chứa tài nguyên bên ngoài (hình ảnh, CSS, script) không? + +Có. Parser streaming xử lý các tham chiếu bên ngoài như các thuộc tính thông thường. Nó **không** tải về các tài nguyên trừ khi bạn yêu cầu rõ ràng. Nếu bạn cần nhúng các tài nguyên đó, có thể sử dụng các API bổ sung từ `aspose.html` sau khi tài liệu đã được tải. + +### Nếu tệp nguồn bị hỏng hoặc không phải là HTML hợp lệ thì sao? + +`HTMLDocument` sẽ cố gắng phục hồi từ các lỗi nhỏ, nhưng các lỗi nghiêm trọng sẽ gây ra ngoại lệ. Hãy bao bọc bước tải trong khối `try/except` để xử lý trường hợp này một cách nhẹ nhàng: + +```python +try: + html_doc = HTMLDocument(source_file) +except Exception as e: + print(f"Failed to load html document: {e}") + return +``` + +### Tôi có thể sửa đổi DOM trước khi lưu không? + +Chắc chắn. Sau khi tải, bạn có quyền truy cập đầy đủ vào cây DOM (`html_doc.dom`). Bạn có thể chèn node, xóa phần tử, hoặc thay đổi thuộc tính, rồi gọi `save` với streaming vẫn được bật. Việc sử dụng bộ nhớ sẽ vẫn thấp vì các thay đổi được áp dụng một cách tăng dần. + +### Streaming có ảnh hưởng đến chất lượng đầu ra không? + +Không. Đầu ra được stream sẽ hoàn toàn giống byte‑for‑byte với kết quả bạn nhận được khi không sử dụng streaming, miễn là bạn không thực hiện thay đổi DOM. Streaming chỉ thay đổi cách dữ liệu được ghi, không thay đổi nội dung được ghi. + +## Mẹo hiệu năng: đo lường mức sử dụng bộ nhớ + +Nếu bạn muốn xác minh rằng streaming thực sự giảm tiêu thụ bộ nhớ, có thể dùng thư viện `psutil`: + +```python +import psutil, os, time + +process = psutil.Process(os.getpid()) +print(f"Memory before load: {process.memory_info().rss / 1024**2:.2f} MB") +# Load, configure, and save as shown above +print(f"Memory after save: {process.memory_info().rss / 1024**2:.2f} MB") +``` + +Bạn thường sẽ thấy chỉ vài megabyte RAM được sử dụng, ngay cả với các tệp HTML 500 MB. + +## Kết luận + +Trong tutorial này, bạn đã học cách **tải tài liệu html** một cách hiệu quả trong Python bằng: + +1. Tạo thể hiện `HTMLDocument` để phân tích tệp một cách lười biếng. +2. Cấu hình `HtmlSaveOptions` với `enable_streaming = True` để ghi với mức bộ nhớ thấp. +3. Lưu tài liệu trong khi stream đầu ra ra đĩa. + +Ba bước này cung cấp cho bạn một mẫu robust để xử lý **các tệp HTML lớn** bằng các kỹ thuật **Python HTML processing**. Từ đây, bạn có thể mở rộng script để sửa đổi DOM, trích xuất dữ liệu, hoặc batch‑process hàng chục tệp — tất cả trong khi giữ mức sử dụng bộ nhớ dự đoán được. + +**Bước tiếp theo** + +* Khám phá API DOM của `aspose.html` để trích xuất bảng, liên kết hoặc hình ảnh. +* Kết hợp cách tiếp cận này với multithreading để xử lý nhiều tệp đồng thời. +* Xem xét `HtmlLoadOptions` nếu bạn cần kiểm soát mã ký tự hoặc các chi tiết phân tích khác. + +Chúc bạn lập trình vui vẻ, và tận hưởng cách **tải tài liệu html** thân thiện với bộ nhớ ở quy mô lớn! + +## What Should You Learn Next? + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Load HTML Document Java – Complete Guide with XPath & CSS](/html/english/java/creating-managing-html-documents/load-html-document-java-complete-guide-with-xpath-css/) +- [Load HTML Using URL in .NET with Aspose.HTML](/html/english/net/html-document-manipulation/load-html-using-url/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file