2010-01-15 37 views
8

Tôi muốn sử dụng BeautfulSoup để tìm kiếm và thay thế <\a> bằng <\a><br>. Tôi biết cách mở bằng urllib2 rồi phân tích cú pháp để trích xuất tất cả các thẻ <a>. Những gì tôi muốn làm là tìm kiếm và thay thế thẻ đóng bằng thẻ đóng cùng với dấu ngắt. Bất kỳ trợ giúp, nhiều đánh giá cao.Tìm kiếm và Thay thế bằng HTML với BeautifulSoup

EDIT

tôi sẽ giả định nó sẽ là một cái gì đó tương tự như:

soup.findAll('a'). 

Trong tài liệu hướng dẫn, có một:

find(text="ahh").replaceWith('Hooray') 

Vì vậy, tôi sẽ giả định nó sẽ là dọc theo các dòng:

soup.findAll(tag = '</a>').replaceWith(tag = '</a><br>') 

Nhưng điều đó không làm việc và sự giúp đỡ python() không cung cấp cho nhiều

Trả lời

15

này sẽ chèn một thẻ <br> sau khi kết thúc mỗi <a>...</a> phần tử:

from BeautifulSoup import BeautifulSoup, Tag 

# .... 

soup = BeautifulSoup(data) 
for a in soup.findAll('a'): 
    a.parent.insert(a.parent.index(a)+1, Tag(soup, 'br')) 

Bạn không thể sử dụng soup.findAll(tag = '</a>') vì BeautifulSoup không hoạt động trên thẻ kết thúc riêng biệt - chúng được coi là một phần của cùng một yếu tố.


Nếu bạn muốn đặt <a> yếu tố bên trong một yếu tố <p> như bạn hỏi trong một chú thích, bạn có thể sử dụng này:

for a in soup.findAll('a'): 
    p = Tag(soup, 'p') #create a P element 
    a.replaceWith(p) #Put it where the A element is 
    p.insert(0, a)  #put the A element inside the P (between <p> and </p>) 

Một lần nữa, bạn không tạo ra các <p></p> riêng bởi vì chúng là một phần của cùng một thứ.

+0

Will rằng thêm nó vào mỗi thẻ mở ? – Kevin

+0

Xem bản chỉnh sửa của tôi - Nó sẽ được thêm sau toàn bộ phần tử ..., rất hiệu quả, nó sẽ chỉ sau. – interjay

+0

Is BeautifulSoup.Tag có hợp lệ không? Tôi gặp lỗi khi thử mã này. – Kevin

3

Bạn không thay thế thẻ kết thúc; trong BeautifulSoup, bạn đang xử lý một mô hình đối tượng tài liệu như trong một trình duyệt, không phải là một chuỗi đầy HTML. Vì vậy, bạn không thể 'thay thế' một thẻ kết thúc mà không phải thay thế thẻ bắt đầu.

Điều bạn muốn làm là chèn phần tử <br> mới ngay sau phần tử <a>...</a>. Để làm như vậy, bạn cần phải tìm ra chỉ mục của phần tử <a> bên trong phần tử cha của nó và chèn phần tử mới ngay sau chỉ mục đó. ví dụ.

soup= BeautifulSoup('<body>blah <a href="foo">blah</a> blah</body>') 
for link in soup.findAll('a'): 
    br= Tag(soup, 'br') 
    index= link.parent.contents.index(link) 
    link.parent.insert(index+1, br) 
# soup now serialises to '<body>blah <a href="foo">blah</a><br /> blah</body>' 
+0

Tôi có thể thêm thẻ trước bằng -1. Giả sử tôi muốn làm

. Tôi có thể sử dụng số

trước khi sử dụng chỉ mục -1 và

sau khi sử dụng +1 không? – Kevin

+0

Bạn sẽ thêm phần tử * trước * phần tử đã chọn chỉ sử dụng 'chỉ mục', không cộng hoặc trừ bất kỳ phần tử nào. – bobince

3

giả sử bạn có một yếu tố mà bạn biết chứa "br" thẻ đánh dấu, một cách để loại bỏ & thay thế "br" thẻ với một chuỗi khác nhau là như thế này:

originalSoup = BeautifulSoup("your_html_file.html") 
replaceString = ", " # replace each <br/> tag with ", " 
# Ex. <p>Hello<br/>World</p> to <p>Hello, World</p> 
cleanSoup = BeautifulSoup(str(originalSoup).replace("<br/>", replaceString)) 
+0

Nó đã giúp. Cảm ơn :) – subodhkalika

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