2013-07-14 9 views
8

Tôi đang cố gắng phân tích cú pháp tài liệu HTML bằng thư viện Python BeautifulSoup, nhưng cấu trúc bị méo bởi các thẻ <br>. Để tôi cho bạn một ví dụ.Cấu trúc anh chị em Beautifulsoup với thẻ br

Input HTML:

<div> 
    some text <br> 
    <span> some more text </span> <br> 
    <span> and more text </span> 
</div> 

HTML BeautifulSoup giải thích:

<div> 
    some text 
    <br> 
    <span> some more text </span> 
    <br> 
     <span> and more text </span> 
    </br> 
    </br> 
</div> 

Trong nguồn, nhịp có thể được coi anh chị em. Sau khi phân tích cú pháp (sử dụng trình phân tích cú pháp mặc định), các nhịp đột nhiên không còn là anh chị em nữa, vì các thẻ br trở thành một phần của cấu trúc. Các giải pháp tôi có thể nghĩ đến để giải quyết điều này là để cắt các thẻ <br> hoàn toàn, trước khi đổ html vào Beautifulsoup, nhưng điều đó không có vẻ rất thanh lịch, vì nó đòi hỏi tôi phải thay đổi đầu vào. Cách tốt hơn để giải quyết vấn đề này là gì?

+2

Nên có hai thẻ div đó, bạn dường như có ' TerryA

+1

Thậm chí ấn định khoảng, tôi đã tái tạo các lỗi sử dụng BS4. b3, tuy nhiên không có vấn đề gì. – dilbert

+0

Thật vậy. Khoảng là một lỗi đánh máy trên SO, không phải trong mã thực tế của tôi. dilbert là chính xác. – Joost

Trả lời

7

Đặt cược tốt nhất của bạn là extract() ngắt dòng. Nó dễ hơn bạn nghĩ :).

>>> from bs4 import BeautifulSoup as BS 
>>> html = """<div> 
... some text <br> 
... <span> some more text </span> <br> 
... <span> and more text </span> 
... </div>""" 
>>> soup = BS(html) 
>>> for linebreak in soup.find_all('br'): 
...  linebreak.extract() 
... 
<br/> 
<br/> 
>>> print soup.prettify() 
<html> 
<body> 
    <div> 
    some text 
    <span> 
    some more text 
    </span> 
    <span> 
    and more text 
    </span> 
    </div> 
</body> 
</html> 
+1

Tuy nhiên, bs4 có vấn đề. – dilbert

+0

Rất tốt để xem nó hoạt động, nhưng tôi không thể tìm thấy phương pháp trích xuất trong Tài liệu. Nó làm gì? – Joost

+1

@Joost [qua đây;)] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#extract) – TerryA

2

Bạn cũng có thể làm một cái gì đó như thế:

str(soup).replace("</br>", "") 
2

Đây là một câu hỏi siêu cũ nhưng tôi chỉ có một vấn đề tương tự bởi vì tài liệu của tôi chứa closong </br> thẻ. Bởi vì điều này, khối lượng lớn tài liệu đã được bỏ qua bởi beatifulsoup (bs cố gắng để đối phó với một thẻ đóng, tôi giả sử.) soup.find_all('br') đã không thực sự tìm thấy bất cứ điều gì vì không có thẻ mở br, vì vậy tôi không thể sử dụng extract() phương pháp.

Sau khi bashing đầu tôi trong một giờ, tôi thấy rằng sử dụng trình phân tích cú pháp lxml thay vì html mặc định đã khắc phục được sự cố.

soup = BeautifulSoup(page, 'lxml')

+0

Lưu ý rằng nó cũng sẽ thêm dư thừa thẻ và điều gì còn tồi tệ hơn nữa, nếu bạn có đoạn văn bản không được đóng trong một số thẻ HTML, nó sẽ được bao bọc bởi phần tử span. – Fusion

+0

Để rõ ràng, nhận xét của bạn về trình phân tích cú pháp lxml hay trình phân tích cú pháp mặc định? – redFur

+0

Vâng, hãy chú ý cách mỗi trình phân tích cú pháp thêm các phần tử không cần thiết VÀ/HOẶC tự động thay đổi HTML không hợp lệ (ví dụ:
được tự động thay đổi thành
, v.v.). https://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers – Fusion