2011-12-16 33 views
8

Tôi có bên dưới (giản thể) mã, trong đó sử dụng các nguồn sau đây:BeautifulSoup: lấy tên tag của bản thân yếu tố, chứ không phải con của nó

<html> 
    <p>line 1</p> 
    <div> 
     <a>line 2</a> 
    </div> 
</html> 

soup = BeautifulSoup('<html><p>line 1</p><div><a>line 2</a></div></html>') 
ele = soup.find('p').nextSibling 
somehow_print_tag_of_ele_here 

Tôi muốn nhận được thẻ của ele, trong trường hợp này " div ". Tuy nhiên, tôi dường như chỉ có thể nhận được thẻ của con cái của nó. Tôi thiếu một cái gì đó đơn giản? Tôi nghĩ rằng tôi có thể làm ele.tag.name, nhưng đó là một ngoại lệ vì thẻ là Không.

#Below correctly prints the div element "<div><a>line 2</a></div>" 
print ele 

#Below prints "None". Printing tag.name is an exception since tag is None 
print ele.tag 

#Below prints "a", the child of ele 
allTags = ele.findAll(True) 
for e in allTags: 
    print e.name 

Tại thời điểm này, tôi đang xem xét làm một cái gì đó dọc theo cách để nhận được phụ huynh của ele, sau đó nhận được các thẻ của trẻ em của cha mẹ và, sau khi đếm có bao nhiêu anh chị em trên ele có, đếm ngược cho đứa trẻ đúng nhãn. Điều đó có vẻ vô lý.

Trả lời

18

ele đã là một thẻ, hãy thử làm điều này:

soup = BeautifulSoup('<html><p>line 1</p><div><a>line 2</a></div></html>') 
print(soup.find('p').nextSibling.name) 

như vậy trong ví dụ của bạn nó sẽ là chỉ

print(ele.name) 
+0

Nhưng điều đó đòi hỏi đã biết rằng nó là một thẻ div. – user984003

+0

@ user984003 xem chỉnh sửa, tôi đã đề xuất một ví dụ, nhưng nó sẽ hoạt động theo cách bạn yêu cầu. phần quan trọng là bạn không nên làm .tag.name, chỉ .name trực tiếp –

+0

NHƯNG, tôi thấy, tôi đã có một thẻ vì vậy tôi làm: in ele.name. Tôi đã thử nghiệm nó và nó đã làm việc :) Tôi WS thiếu một cái gì đó đơn giản! Nếu bạn chỉnh sửa câu trả lời của mình để nói ele.name thì tôi sẽ kiểm tra câu trả lời đó là câu trả lời chính xác khi tôi có thể. – user984003

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