Làm việc với các phần tử anh em
Hàm BeautifulSoup next_siblings() làm nó là nhỏ nhặt để thu thập dữ liệu từ các bảng, đặc biệt những cái với
các dòng title:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(‘http://www.pythonscraping.com/pages/page3.html’)
bs = BeautifulSoup(html, ‘html.parser’)
for sibling in bs.find(‘table’, {‘id’:’giftList’}).tr.next_siblings:print(sibling)
Đầu ra của code này là để in ra tất cả các dòng products từ bảng product, ngoại trừ dòng title đầu tiên. Tại sao
dòng title bị bỏ qua? Các objects không thể là anh em với bản thân chúng. Bất cứ khi nào bạn nhận các anh em của
một object, bản thân object sẽ không được bao gồm trong list. Như tên của hàm ngầm ý, nó gọi chỉ các anh em tiếp
theo. Nếu bạn sẽ chọn một dòng ở giữa list, ví dụ, và gọi next_siblings trên nó, chỉ các anh em tiếp nối sẽ được
trả về. Nên, bằng cách chọn dòng title và gọi next_siblings, bạn có thể chọn tất cả các dòng trong bảng mà không
chọn dòng title bản thân nó.
Làm các lựa chọn tùy chỉnh
Code trên cũng sẽ làm việc nếu bạn chọn bs.table.tr hay thậm chí chỉ bs.tr để chọn dòng đầu tiên của bảng. Tuy
nhiên, trong code, tôi sẽ gặp khó khăn viết mọi thứ theo một hình thức dài hơn:
bs.find(‘table’,{‘id’:’giftList’}).tr
Thậm chí nếu nó trông như chính có một bảng (hay tag mục tiêu khác) trên trang, nó là dễ để bỏ lỡ các thứ. Ngoài
ra, các bố cục trang thay đổi mọi lần. Là cái gì một khi cái đầu tiên loại của nó trên trang một ngày nào đó là
tag thứ hai hay thứ ba của dạng đó tìm thấy trên trang. Để làm các scrapers mạnh mẽ hơn, nó là tốt nhất tùy chỉnh
như có thể khi thực hiện chọn tag. Tận dụng các thuộc tính tag khi chúng là có sẵn.
Như một bổ sung cho next_siblings, hàm previous_siblings thường có thể là hữu dụng nếu có một tag có thể chọn
rõ ràng tại cuối một list các tags anh em cái bạn sẽ thích nhận.
Và, tất nhiên, có các hàm next_sibling và previous_sibling, cái thực hiện gần như cùng chức năng như next_siblings
và previous_siblings, ngoại trừ chúng trả về một tag đơn hơn là một list chúng.