Hướng dẫn dành cho người mới bắt đầu
Nhiếp ảnh tập trung nông của nhện Web Web của Robert Anasch trên unplashTìm hiểu cách bạn có thể phân tích, khám phá, sửa đổi và điền các tệp XML với gói Python ElementTree, cho các vòng lặp và biểu thức XPath. Là một nhà khoa học dữ liệu, bạn sẽ thấy rằng việc hiểu XML rất mạnh mẽ cho cả thực hành web và thực hành chung trong việc phân tích một tài liệu có cấu trúc
Ngôn ngữ đánh dấu có thể mở rộng [XML] là ngôn ngữ đánh dấu mã hóa các tài liệu bằng cách xác định một tập hợp các quy tắc ở cả định dạng có thể đọc được bằng máy và có thể đọc được. Mở rộng từ SGML [Ngôn ngữ đánh dấu tổng quát tiêu chuẩn], nó cho phép chúng tôi mô tả cấu trúc của tài liệu. Trong XML, chúng ta có thể xác định các thẻ tùy chỉnh. Chúng tôi cũng có thể sử dụng XML làm định dạng tiêu chuẩn để trao đổi thông tin.[XML] is a markup language which encodes documents by defining a set of rules in both machine-readable and human-readable format. Extended from SGML [Standard Generalized Markup Language], it lets us describe the structure of the document. In XML, we can define custom tags. We can also use XML as a standard format to exchange information.
- Các tài liệu XML có các phần, được gọi là các phần tử, được xác định bởi một thẻ bắt đầu và thẻ kết thúc. Một thẻ là một cấu trúc đánh dấu bắt đầu bằng
tree = ET.parse['movies.xml']
3 và kết thúc bằng
root = tree.getroot[]tree = ET.parse['movies.xml']
4. Các ký tự giữa thẻ bắt đầu và thẻ kết thúc, nếu có bất kỳ, là nội dung của phần tử. Các yếu tố có thể chứa đánh dấu, bao gồm các yếu tố khác, được gọi là "các yếu tố con".elements, defined by a beginning and an ending tag. A tag is a markup construct that begins with
root = tree.getroot[]tree = ET.parse['movies.xml']
3 and ends with
root = tree.getroot[]tree = ET.parse['movies.xml']
4. The characters between the start-tag and end-tag, if there are any, are the element's content. Elements can contain markup, including other elements, which are called "child elements".
root = tree.getroot[] - Phần tử cấp cao nhất, cấp cao nhất được gọi là gốc, chứa tất cả các yếu tố khác.root, which contains all other elements.
- Các thuộc tính là cặp có giá trị tên tồn tại trong thẻ bắt đầu hoặc thẻ phần tử trống. Một thuộc tính XML chỉ có thể có một giá trị duy nhất và mỗi thuộc tính có thể xuất hiện nhiều nhất một lần trên mỗi phần tử.
Ở đây, một ảnh chụp nhanh
tree = ET.parse['movies.xml']
root = tree.getroot[]
5 mà chúng tôi sẽ sử dụng cho hướng dẫn này:
DVD
1981
PG
'Archaeologist and adventurer Indiana Jones
is hired by the U.S. government to find the Ark of the Covenant before the Nazis.'
DVD,Online
1984
PG
None provided.
Blu-ray
1985
PG
Marty McFly
dvd, digital
2000
PG-13
Two mutants come to a private academy for their kind whose resident superhero team must oppose a terrorist organization with similar powers.
VHS
1992
PG13
NA.
Online
1992
R
WhAtEvER I Want!!!?!
DVD
1979
R
"""""""""
DVD
1986
PG13
Funny movie on funny guy
blue-ray
2000
Unrated
psychopathic Bateman
Giới thiệu về ElementTree
Cấu trúc cây XML làm cho điều hướng, sửa đổi và loại bỏ tương đối đơn giản theo chương trình. Python có một thư viện, ElementTree tích hợp, có các chức năng để đọc và thao tác XMLS [và các tệp có cấu trúc tương tự khác].ElementTree, that has functions to read and manipulate XMLs [and other similarly structured files].
Đầu tiên, nhập
tree = ET.parse['movies.xml']
root = tree.getroot[]
6. Đó là một thực tế phổ biến để sử dụng bí danh của tree = ET.parse['movies.xml']
root = tree.getroot[]
7:import xml.etree.ElementTree as ET
Phân tích dữ liệu XML
Trong tệp XML được cung cấp, có một bộ phim cơ bản được mô tả. Vấn đề duy nhất là dữ liệu là một mớ hỗn độn! Đã có rất nhiều người phụ trách khác nhau của bộ sưu tập này và mọi người đều có cách nhập dữ liệu riêng vào tệp. Mục tiêu chính trong hướng dẫn này sẽ là đọc và hiểu tệp với Python - sau đó khắc phục các vấn đề.
Đầu tiên bạn cần đọc trong tệp với
tree = ET.parse['movies.xml']
root = tree.getroot[]
6.tree = ET.parse['movies.xml']
root = tree.getroot[]
Bây giờ bạn đã khởi tạo cây, bạn nên nhìn vào XML và in ra các giá trị để hiểu cách cấu trúc cây.
root.tag'collection'
Ở cấp cao nhất, bạn thấy rằng XML này được bắt nguồn từ thẻ
tree = ET.parse['movies.xml']
root = tree.getroot[]
9.root.attrib{}
Cho các vòng lặp
Bạn có thể dễ dàng lặp lại trên các phần mềm [thường được gọi là trẻ em trẻ em] trong root bằng cách sử dụng một vòng lặp đơn giản cho vòng lặp.
for child in root:
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
Bây giờ bạn biết rằng những đứa trẻ của gốc
tree = ET.parse['movies.xml']
root = tree.getroot[]
9 đều là root.tag'collection'1. Để chỉ định thể loại, XML sử dụng thuộc tính
root.tag'collection'2. Có những bộ phim hành động, phim kinh dị và hài kịch theo yếu tố
root.tag'collection'1.
Thông thường, rất hữu ích khi biết tất cả các yếu tố trong toàn bộ cây. Một chức năng hữu ích để làm điều đó là
root.tag'collection'4.
[elem.tag for elem in root.iter[]]['collection',
'genre',
'decade',
'movie',
'format',
'year',
'rating',
'description',
'movie',
.
.
.
.
'movie',
'format',
'year',
'rating',
'description']
Có một cách hữu ích để xem toàn bộ tài liệu. Nếu bạn chuyển gốc vào phương thức
root.tag'collection'5, bạn có thể trả lại toàn bộ tài liệu. Trong ElementTree, phương pháp này có một dạng hơi lạ.
Vì ElementTree là một thư viện mạnh mẽ có thể diễn giải nhiều hơn chỉ XML, bạn phải chỉ định cả mã hóa và giải mã tài liệu bạn đang hiển thị dưới dạng chuỗi.
Bạn có thể mở rộng việc sử dụng chức năng
root.tag'collection'6 để giúp tìm các yếu tố cụ thể quan tâm.
root.tag'collection'4 sẽ liệt kê tất cả các subels trong root phù hợp với phần tử được chỉ định. Ở đây, bạn sẽ liệt kê tất cả các thuộc tính của phần tử
root.tag'collection'8 trong cây:
for movie in root.iter['movie']:
print[movie.attrib]{'favorite': 'True', 'title': 'Indiana Jones: The raiders of the lost Ark'}
{'favorite': 'True', 'title': 'THE KARATE KID'}
{'favorite': 'False', 'title': 'Back 2 the Future'}
{'favorite': 'False', 'title': 'X-Men'}
{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}
{'favorite': 'False', 'title': 'ALIEN'}
{'favorite': 'True', 'title': "Ferris Bueller's Day Off"}
{'favorite': 'FALSE', 'title': 'American Psycho'}
{'favorite': 'False', 'title': 'Batman: The Movie'}
{'favorite': 'True', 'title': 'Easy A'}
{'favorite': 'True', 'title': 'Dinner for SCHMUCKS'}
{'favorite': 'False', 'title': 'Ghostbusters'}
{'favorite': 'True', 'title': 'Robin Hood: Prince of Thieves'}
Biểu thức XPath
Nhiều lần các yếu tố sẽ không có thuộc tính, chúng sẽ chỉ có nội dung văn bản. Sử dụng thuộc tính
root.tag'collection'9, bạn có thể in nội dung này.
Bây giờ, in ra tất cả các mô tả của các bộ phim.
for description in root.iter['description']:
print[description.text]'Archaeologist and adventurer Indiana Jones is hired by the U.S. government to find the Ark of the Covenant before the Nazis.'None provided.
Marty McFly
Two mutants come to a private academy for their kind whose resident superhero team must oppose a terrorist organization with similar powers.
NA.
WhAtEvER I Want!!!?!
"""""""""
Funny movie about a funny guy
psychopathic Bateman
What a joke!
Emma Stone = Hester Prynne
Tim [Rudd] is a rising executive who “succeeds” in finding the perfect guest, IRS employee Barry [Carell], for his boss’ monthly event, a so-called “dinner for idiots,” which offers certain
advantages to the exec who shows up with the biggest buffoon.Who ya gonna call?
Robin Hood slaying
In XML rất hữu ích, nhưng XPath là ngôn ngữ truy vấn được sử dụng để tìm kiếm thông qua XML nhanh chóng và dễ dàng. Tuy nhiên, việc hiểu XPath là cực kỳ quan trọng đối với việc quét và điền XMLS.
tree = ET.parse['movies.xml']
root = tree.getroot[]
6 có chức năng root.attrib{}1 sẽ đi qua những đứa trẻ ngay lập tức của yếu tố được tham chiếu.
Tại đây, bạn sẽ tìm kiếm cây cho những bộ phim ra mắt vào năm 1992:
for movie in root.findall["./genre/decade/movie/[year='1992']"]:
print[movie.attrib]{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}
Hàm
root.attrib{}1 luôn bắt đầu tại phần tử được chỉ định. Loại chức năng này cực kỳ mạnh mẽ cho "Tìm và thay thế". Bạn thậm chí có thể tìm kiếm trên các thuộc tính!
Bây giờ, chỉ in ra những bộ phim có sẵn ở nhiều định dạng [một thuộc tính].
import xml.etree.ElementTree as ET
0Động não tại sao, trong trường hợp này, câu lệnh in trả về các giá trị của vâng của
root.attrib{}3. Hãy suy nghĩ về cách xác định vòng lặp "cho".
Mẹo: Sử dụng root.attrib{}
4 bên trong XPath để trả về phần tử cha của phần tử hiện tại.: use
root.attrib{}4 inside of XPath to return the parent element of the current element.
import xml.etree.ElementTree as ET
1Sửa đổi XML
Trước đó, các tựa phim là một mớ hỗn độn tuyệt đối. Bây giờ, in lại chúng:
for movie in root.iter['movie']:
print[movie.attrib]{'favorite': 'True', 'title': 'Indiana Jones: The raiders of the lost Ark'}
{'favorite': 'True', 'title': 'THE KARATE KID'}
{'favorite': 'False', 'title': 'Back 2 the Future'}
{'favorite': 'False', 'title': 'X-Men'}
{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}
{'favorite': 'False', 'title': 'ALIEN'}
{'favorite': 'True', 'title': "Ferris Bueller's Day Off"}
{'favorite': 'FALSE', 'title': 'American Psycho'}
{'favorite': 'False', 'title': 'Batman: The Movie'}
{'favorite': 'True', 'title': 'Easy A'}
{'favorite': 'True', 'title': 'Dinner for SCHMUCKS'}
{'favorite': 'False', 'title': 'Ghostbusters'}
{'favorite': 'True', 'title': 'Robin Hood: Prince of Thieves'}
Khắc phục ’2, trong tương lai. Tương lai. Đó nên là một vấn đề tìm thấy và thay thế. Viết mã để tìm tiêu đề ‘Back 2 The Future, và lưu nó dưới dạng biến:
import xml.etree.ElementTree as ET
3Lưu ý rằng sử dụng phương thức
root.attrib{}5 trả về một phần tử của cây. Phần lớn thời gian, nó hữu ích hơn khi chỉnh sửa nội dung trong một phần tử.
Sửa đổi thuộc tính
root.attrib{}6 của Back 2 Biến phần tử trong tương lai để đọc "trở lại tương lai". Sau đó, in ra các thuộc tính của biến của bạn để xem sự thay đổi của bạn. Bạn có thể dễ dàng thực hiện điều này bằng cách truy cập thuộc tính của một phần tử và sau đó gán một giá trị mới cho nó:
import xml.etree.ElementTree as ET
4Viết lại các thay đổi của bạn trở lại XML để chúng được sửa vĩnh viễn trong tài liệu. In lại các thuộc tính phim của bạn một lần nữa để đảm bảo các thay đổi của bạn hoạt động. Sử dụng phương thức
root.attrib{}7 để làm điều này:
import xml.etree.ElementTree as ET
5Sửa các thuộc tính
Thuộc tính
root.attrib{}3 không chính xác ở một số nơi. Sử dụng
tree = ET.parse['movies.xml']
root = tree.getroot[]
6 để sửa lỗi chỉ định dựa trên số lượng bộ phim xuất hiện. Đầu tiên, in for child in root:0Attribution và văn bản để xem phần nào cần được sửa.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
import xml.etree.ElementTree as ET
6Có một số công việc cần phải được thực hiện trên thẻ này.
Bạn có thể sử dụng Regex để tìm dấu phẩy - điều đó sẽ cho biết liệu thuộc tính
root.attrib{}3 nên là "có" hoặc "không". Thêm và sửa đổi các thuộc tính có thể được thực hiện dễ dàng với
for child in root:2Method.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
import xml.etree.ElementTree as ET
7Các yếu tố di chuyển
Một số dữ liệu đã được đặt trong thập kỷ sai. Sử dụng những gì bạn đã học về XML và
tree = ET.parse['movies.xml']
root = tree.getroot[]
6 để tìm và sửa lỗi dữ liệu thập kỷ.Sẽ rất hữu ích khi in ra cả thẻ
for child in root:4 và thẻ
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
for child in root:5 trong toàn bộ tài liệu.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
import xml.etree.ElementTree as ET
8Hai năm trong thập kỷ sai là những bộ phim từ những năm 2000. Tìm hiểu những bộ phim đó là gì, sử dụng biểu thức XPath.
import xml.etree.ElementTree as ET
9Bạn phải thêm một thẻ thập kỷ mới, những năm 2000, vào thể loại hành động để di chuyển dữ liệu X-Men. Phương pháp
for child in root:6 có thể được sử dụng để thêm thẻ này vào cuối XML.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
tree = ET.parse['movies.xml']
root = tree.getroot[]
0Bây giờ hãy nối bộ phim X-Men vào những năm 2000 và loại bỏ nó khỏi những năm 1990, lần lượt sử dụng
for child in root:7 và
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
for child in root:8.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
tree = ET.parse['movies.xml']
root = tree.getroot[]
1Xây dựng tài liệu XML
Tốt, vì vậy về cơ bản bạn đã có thể chuyển toàn bộ một bộ phim sang một thập kỷ mới. Lưu các thay đổi của bạn trở lại XML.
tree = ET.parse['movies.xml']
root = tree.getroot[]
2Sự kết luận
ElementTree là một thư viện Python quan trọng cho phép bạn phân tích và điều hướng một tài liệu XML. Sử dụng ElementTree phá vỡ tài liệu XML trong cấu trúc cây dễ hoạt động. Khi nghi ngờ, hãy in nó ra [
for child in root:9] - Sử dụng câu lệnh in hữu ích này để xem toàn bộ tài liệu XML cùng một lúc.
print[child.tag, child.attrib]genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
Người giới thiệu
- Bài viết gốc như được xuất bản bởi Steph Howson: DataCamp
- Tài liệu Python 3: ElementTree
- Wikipedia: XML