2011-12-16 2 views
8

У меня есть ниже (упрощенный) код, который использует следующий источник:BeautifulSoup: получить имя тега самого элемента, а не его дети

<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 

Я хочу, чтобы получить тег Ele, в данном случае " ДИВ». Тем не менее, я только, кажется, могу получить тег своих детей. Я что-то пропустил? Я думал, что могу сделать ele.tag.name, но это исключение, поскольку тег - None.

#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 

На данный момент я рассматриваю делать что-то по пути получения родителя Ele, а затем получить тег детей родителя и, подсчитав, сколько верхних брат Эля есть, обратный отсчет до правильного ребенка тег. Это кажется смешным.

ответ

18

Эле уже тег, попробуйте сделать следующее:

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

так в вашем примере это будет просто

print(ele.name) 
+0

Но это требует уже зная, что это DIV тег. – user984003

+0

@ user984003 см. Редактирование, я предложил пример, но он должен работать так, как вы просили. важная часть состоит в том, что вы не должны делать .tag.name, просто .name напрямую –

+0

НО, я вижу, у меня уже есть тег, поэтому я делаю: print ele.name. Я тестировал его, и он работал :) Я пропустил что-то простое! Если вы отредактируете свой ответ, чтобы сказать ele.name, тогда я проверю его как правильный ответ, когда смогу. – user984003

Смежные вопросы