2015-10-15 20 views
6

This question được hỏi bốn năm trước, nhưng câu trả lời giờ đã lỗi thời cho BS4.Cách tìm tất cả các nhận xét với Beautiful Soup

Tôi muốn xóa tất cả nhận xét trong tệp html của mình bằng cách sử dụng súp đẹp. Kể từ khi BS4 làm cho mỗi comment as a special type of navigable string, tôi nghĩ mã này sẽ làm việc:

for comments in soup.find_all('comment'): 
    comments.decompose() 

Vì vậy, điều đó không làm việc .... Làm thế nào để tìm thấy tất cả các ý kiến ​​sử dụng BS4?

+0

[answer] (http://stackoverflow.com/a/3507360/771848) này vẫn hoạt động mà tôi cho là vậy. – alecxe

+0

Tôi nhận được "nhận xét tên chung" không được xác định " – Joseph

+1

Tôi nhận ra đây là cũ, nhưng @Joseph, nếu bạn nhập Nhận xét từ bs4, nó sẽ hoạt động – atarw

Trả lời

8

Bạn có thể vượt qua một chức năng để find_all() để giúp kiểm tra xem chuỗi có phải là Nhận xét hay không.

Ví dụ tôi có dưới html:

<body> 
    <!-- Branding and main navigation --> 
    <div class="Branding">The Science &amp; Safety Behind Your Favorite Products</div> 
    <div class="l-branding"> 
     <p>Just a brand</p> 
    </div> 
     <!-- test comment here --> 
     <div class="block_content"> 
      <a href="https://www.google.com">Google</a> 
    </div> 
</body> 

Code:

from bs4 import BeautifulSoup as BS 
from bs4 import Comment 
.... 
soup=BS(html,'html.parser') 
comments=soup.find_all(string=lambda text:isinstance(text,Comment)) 
for c in comments: 
    print c 
    print "===========" 
    c.decompose() 

đầu ra sẽ là:

Branding and main navigation 
============ 
test comment here 
============ 

BTW, tôi nghĩ lý do tại sao find_all('Comment') không công việc là (từ tài liệu của BeautifulSoup):

Chuyển giá trị cho tên và bạn sẽ cho Beautiful Soup biết chỉ xem xét các thẻ có tên nhất định. Chuỗi văn bản sẽ bị bỏ qua, cũng như các thẻ có tên không khớp.

+0

Tôi rất vui vì tôi đã tìm thấy câu trả lời của bạn, cảm ơn! Bất kỳ ý tưởng làm thế nào chúng ta có thể viết nó mà không cần sử dụng lambda? – JinSnow

6

Hai điều tôi cần làm:

Đầu tiên, khi nhập khẩu Beautiful Soup

Thứ hai, đây là đoạn code để trích xuất ý kiến ​​

for comments in soup.findAll(text=lambda text:isinstance(text, Comment)): 
    comments.extract() 
Các vấn đề liên quan