2016-03-18 27 views
5

Xin chào, vì vậy tôi áp dụng find_all trên beautifulsoup object và tìm một thứ gì đó, là bs4.element.ResultSet object hoặc list.beautifulsoup: find_all trên bs4.element.ResultSet đối tượng hoặc danh sách?

Tôi muốn tìm thêm trong đó, nhưng không được phép trên bs4.element.ResultSet object. Tôi có thể lặp qua từng phần tử của bs4.element.ResultSet object để thực hiện find_all. Nhưng tôi có thể tránh lặp lại và chỉ chuyển đổi nó trở về beautifulsoup object?

Xem mã để biết chi tiết. Cảm ơn

html_1 = """ 
<table> 
    <thead> 
     <tr class="myClass"> 
      <th>A</th> 
      <th>B</th> 
      <th>C</th> 
      <th>D</th> 
     </tr> 
    </thead> 
</table> 
""" 
soup = BeautifulSoup(html_1, 'html.parser') 

type(soup) #bs4.BeautifulSoup 

# do find_all on beautifulsoup object 
th_all = soup.find_all('th') 

# the result is of type bs4.element.ResultSet or similarly list 
type(th_all) #bs4.element.ResultSet 
type(th_all[0:1]) #list 

# now I want to further do find_all 
th_all.find_all(text='A') #not work 

# can I avoid this need of loop? 
for th in th_all: 
    th.find_all(text='A') #works 

Trả lời

8

ResultSet lớp là một lớp con của một danh sách và không phải là một Tag class trong đó có các find* phương pháp xác định. Looping qua kết quả của find_all() là phương pháp phổ biến nhất:

th_all = soup.find_all('th') 
result = [] 
for th in th_all: 
    result.extend(th.find_all(text='A')) 

Thông thường, CSS selectors có thể giúp bạn giải quyết nó trong một đi, ngoại trừ rằng không phải mọi thứ bạn có thể làm với find_all() có thể với phương pháp select(). Ví dụ: không có tìm kiếm "văn bản" nào có sẵn trong bs4 bộ chọn CSS. Nhưng, nếu, ví dụ, bạn phải tìm tất cả, nói, b yếu tố bên trong th yếu tố, bạn có thể làm:

soup.select("th td") 
+0

Sau khi sao chép kết quả của soup.find_all để th_all, sẽ làm thay đổi th_all phản ánh trong Súp? –

+0

Có nó sẽ. Phụ thuộc vào chức năng bạn sử dụng. Tham khảo: https://beautiful-soup-4.readthedocs.io/en/latest/#modifying-the-tree –

Các vấn đề liên quan