Làm việc với phần tử con và các hậu duệ khác
Trong khoa học máy tính và một vài nhánh của toán học, bạn thường nghe về các thứ kinh khủng làm cho các
phần tử con: di chuyển chúng, lưu giữ chúng, xóa bỏ chúng và thậm chí diệt chúng. May mắn là, phần này tập trung
chỉ vào chọn chúng!
Trong thư viện BeautifulSoup, cũng như nhiều thư viện khác, có một khác biệt vạch ra giữa các phần tử con
và các phần tử hậu duệ: rất giống một cây gia đình của con người, các phần tử con luôn chính xác là
một tag dưới một phần tử cha, trong khi các phần tử hậu duệ có thể là bất cứ mức nào trong cây dưới phần
tử cha. Ví dụ, các tags tr là các phần tử con của tag table, trong khi tr, th, td, img và span tất cả
là phần tử hậu duệ của tag table (ít nhất trong trang ví dụ của chúng ta). Tât cả các phần tử con cũng
là hậu duệ, nhưng không phải tất cả các phần tử hậu duệ là con.
Nói chung, các hàm BeautifulSoup luôn làm việc với các hậu duệ của tag được chọn hiện tại. Ví dụ,
bs.body.h1 chọn tag h1 đầu tiên cái là hậu duệ của tag body. Nó sẽ không tìm ra các tags nằm bên ngoài
body.
Tương tư, bs.div.find_all(‘img’) sẽ tìm ra tag div đầu tiên trong tài liệu, và sau đó giành một list
tất cả các tag img cái là hậu duệ của tag div đó.
Nếu bạn muốn tìm ra chỉ các hậu duệ cái là các con, bạn có thể sử dụng tag .children:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(‘http://www.pythonscraping.com/pages/page3.html’)
bs = BeautifulSoup(html, ‘html.parser’)
for child in bs.find(‘table’,{‘id’:’giftList’}).children:print(child)
Code này in ra list các dòng product trong bảng giftlist, bao gồm dòng ban đầu của các nhãn cột. Nếu bạn sẽ viết nó
sử dụng hàm descendants() thay vì hàm children(), khoảng 2 tá tags sẽ được tìm thấy bên trong bảng và được in ra, bao
gồm các tags img, tags span, và tags td riêng rẽ. Nó hoàn toàn là quan trọng để phân biệt giứa các phần tử con và
hậu duệ!