🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Cách Phân Tích XML trong Python (10 Phương Pháp + Ví Dụ)

Michael Lee
Michael Lee

Expert Network Defense Engineer

24-Sep-2025

Phân tích XML là một nhiệm vụ phổ biến trong Python, cho dù bạn đang làm việc với các tệp cấu hình, thu thập dữ liệu từ web hay API. Hướng dẫn này cung cấp 10 giải pháp khác nhau với các ví dụ mã, trường hợp sử dụng, bảng so sánh và câu hỏi thường gặp. Cuối cùng, bạn sẽ biết phương pháp nào phù hợp nhất với dự án của mình.


🔹 XML Parsing là gì?

XML (eXtensible Markup Language) được sử dụng rộng rãi để lưu trữ và vận chuyển dữ liệu. Phân tích XML có nghĩa là đọc cấu trúc XML và trích xuất thông tin hữu ích. Trong Python, bạn có nhiều cách để đạt được điều này, từ các thư viện tích hợp sẵn đến các framework nâng cao.


🔹 Giải pháp 1: Sử dụng xml.etree.ElementTree (Thư viện tiêu chuẩn)

python Copy
import xml.etree.ElementTree as ET

xml_data = '''<root><item>Apple</item><item>Banana</item></root>'''
root = ET.fromstring(xml_data)

for child in root:
    print(child.tag, child.text)

✅ Ưu điểm: Tích hợp sẵn, nhanh, không phụ thuộc.
⚠️ Nhược điểm: Xác thực hạn chế, yếu hơn cho XML phức tạp.


🔹 Giải pháp 2: Sử dụng xml.dom.minidom

python Copy
from xml.dom import minidom

doc = minidom.parseString('<root><item>Apple</item></root>')
items = doc.getElementsByTagName("item")

for item in items:
    print(item.firstChild.data)

✅ Ưu điểm: In đẹp, dễ sử dụng.
⚠️ Nhược điểm: Tốn bộ nhớ cho XML lớn.


🔹 Giải pháp 3: Sử dụng lxml

python Copy
from lxml import etree

xml_data = '''<root><item>Apple</item><item>Banana</item></root>'''
root = etree.fromstring(xml_data)

for item in root.findall("item"):
    print(item.text)

✅ Ưu điểm: Rất nhanh, hỗ trợ XPath, xác thực.
⚠️ Nhược điểm: Cần cài đặt (pip install lxml).


🔹 Giải pháp 4: Sử dụng BeautifulSoup

python Copy
from bs4 import BeautifulSoup

xml_data = """<root><item>Apple</item><item>Banana</item></root>"""
soup = BeautifulSoup(xml_data, "xml")

for item in soup.find_all("item"):
    print(item.text)

✅ Ưu điểm: Thân thiện với người mới, phân tích linh hoạt.
⚠️ Nhược điểm: Chậm hơn so với lxml.


🔹 Giải pháp 5: Sử dụng defusedxml (Phân tích an toàn)

python Copy
from defusedxml.ElementTree import fromstring

xml_data = '<root><item>Apple</item></root>'
root = fromstring(xml_data)

for child in root:
    print(child.text)

✅ Ưu điểm: Ngăn chặn lỗ hổng XML (XXE, Billion Laughs).
⚠️ Nhược điểm: Tính năng hạn chế.


🔹 Giải pháp 6: Sử dụng xmltodict

python Copy
import xmltodict

xml_data = """<root><item>Apple</item><item>Banana</item></root>"""
parsed = xmltodict.parse(xml_data)

print(parsed["root"]["item"])

✅ Ưu điểm: Chuyển đổi XML → dict Python trực tiếp.
⚠️ Nhược điểm: Không lý tưởng cho việc streaming XML lớn.


🔹 Giải pháp 7: Sử dụng pandas

python Copy
import pandas as pd

xml_data = """<root><row><name>John</name></row><row><name>Jane</name></row></root>"""
df = pd.read_xml(xml_data)
print(df)

✅ Ưu điểm: Hoàn hảo cho phân tích dữ liệu.
⚠️ Nhược điểm: Cần XML có cấu trúc.


🔹 Giải pháp 8: Sử dụng Regex (Không được khuyến cáo)

python Copy
import re

xml_data = '<root><item>Apple</item><item>Banana</item></root>'
items = re.findall(r'<item>(.*?)</item>', xml_data)
print(items)

✅ Ưu điểm: Giải pháp nhanh.
⚠️ Nhược điểm: Dễ vỡ, hỏng trong XML lồng nhau/phức tạp.


🔹 Giải pháp 9: Sử dụng Scrapy (Để thu thập dữ liệu web)

python Copy
import scrapy

class XMLSpider(scrapy.Spider):
    name = "xml_spider"
    start_urls = ["https://example.com/data.xml"]

    def parse(self, response):
        for item in response.xpath("//item/text()").getall():
            yield {"item": item}

✅ Ưu điểm: Có thể mở rộng, tuyệt vời để thu thập dữ liệu từ các nguồn XML.
⚠️ Nhược điểm: Thừa thãi cho việc phân tích đơn giản.


🔹 Giải pháp 10: Sử dụng Scrapeless API (Giải pháp thay thế tốt nhất)

Thay vì tự duy trì logic phân tích, bạn có thể sử dụng Scrapeless Scraping Browser. Nó tự động:

  • Xử lý nội dung động
  • Trích xuất dữ liệu có cấu trúc (JSON, XML)
  • Bỏ qua bảo vệ chống bot
python Copy
import requests

url = "https://api.scrapeless.com/xml-extract"
payload = {"url": "https://example.com/data.xml"}

response = requests.post(url, json=payload)
print(response.json())

✅ Ưu điểm: Không cần thiết lập, mạnh mẽ, có thể mở rộng.
⚠️ Nhược điểm: Dịch vụ trả phí.


🔹 Bảng so sánh

Phương pháp Dễ sử dụng Tốc độ An toàn Tốt nhất cho
ElementTree ⭐⭐⭐ Nhanh XML đơn giản
minidom ⭐⭐ Trung bình In đẹp
lxml ⭐⭐⭐⭐ Rất nhanh XML phức tạp, XPath
BeautifulSoup ⭐⭐⭐ Chậm Người mới
defusedxml ⭐⭐ Trung bình Phân tích an toàn
xmltodict ⭐⭐⭐⭐ Nhanh Chuyển đổi Dict
pandas ⭐⭐⭐ Trung bình Phân tích dữ liệu
Regex Nhanh Chỉ dành cho giải pháp nhanh
Scrapy ⭐⭐⭐ Trung bình Thu thập dữ liệu
Scrapeless API ⭐⭐⭐⭐ Rất nhanh Phân tích cấp doanh nghiệp

🔹 Tình huống Thực tế

  • Tệp cấu hìnhElementTree
  • Tập dữ liệu lớnlxml
  • APIxmltodict
  • Khoa học dữ liệupandas
  • Ứng dụng an toàndefusedxml
  • Web scrapingScrapy hoặc Scrapeless

🔹 Câu hỏi Thường gặp

Q1: Cách nhanh nhất để phân tích XML trong Python là gì?
👉 lxml là giải pháp mã nguồn mở nhanh nhất. Scrapeless API nhanh hơn cho các tác vụ cấp sản xuất.

Q2: Làm thế nào để tôi ngăn chặn các vấn đề bảo mật XML?
👉 Sử dụng defusedxml hoặc Scrapeless API, giúp làm sạch đầu vào.

Q3: Tôi có thể chuyển đổi XML trực tiếp thành JSON không?
👉 Có, xmltodict hoặc Scrapeless API có thể làm điều này.

Q4: Phương pháp nào là tốt nhất cho việc thu thập dữ liệu trên web?
👉 Sử dụng Scrapy cho các dự án nhỏ, Scrapeless cho nhu cầu doanh nghiệp.


🔹 Tài liệu tham khảo


🔹 Kết luận

Python cung cấp nhiều cách để phân tích XML, từ các thư viện tích hợp như ElementTree đến các giải pháp tiên tiến như lxmlScrapy. Nếu bạn cần phân tích có thể mở rộng, an toàn và không cần bảo trì, hãy xem xét sử dụng Trình duyệt Thu thập Scrapeless.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục