Как найти детей узлов с помощью красивого супа
Я хочу получить все <a>
теги, которые являются детьми <li>
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>
Я знаю, как найти элемент с определенным классом такой
soup.find("li", { "class" : "test" })
но я не знаю, как найти все a
для детей <li class=test>
но не какой-либо другой
как я хочу выберите
<a> link1 </a>
6 ответов:
попробуй такое
li = soup.find('li', {'class': 'text'}) children = li.findChildren("a" , recursive=False) for child in children: print child
в документах есть очень маленький раздел, который показывает, как найти/find_all прямые дети.
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
в вашем случае, как вы хотите link1, который является первым прямым потомком.
#for only first direct child soup.find("li", { "class" : "test" }).find("a",recursive=False)
Если вы хотите, чтобы все прямые дети
#for all direct children soup.find("li", { "class" : "test" }.findAll("a",recursive=False)
попробуйте это:
li = soup.find("li", { "class" : "test" }) children = li.find_all("a") # returns a list of all <a> children of li
другие напоминания:
метод find получает только первый встречающийся дочерний элемент. Метод find_all получает все дочерние элементы и сохраняется в списке.
еще один метод-создать функцию фильтра, которая возвращает
True
для всех нужных тегов:def my_filter(tag): return (tag.name == 'a' and tag.parent.name == 'li' and 'test' in tag.parent['class'])
позвони
find_all
С аргументом:for a in soup(my_filter): # or soup.find_all(my_filter) print a
"как найти все
a
для детей<li class=test>
но не любые другие?"учитывая HTML ниже (я добавил еще один
<a>
чтобы показать разницу междуselect
иselect_one
):<div> <li class="test"> <a>link1</a> <ul> <li> <a>link2</a> </li> </ul> <a>link3</a> </li> </div>
решение заключается в использовании child combinator (
>
), который помещается между двумя селекторами CSS:>>> soup.select('li.test > a') [<a>link1</a>, <a>link3</a>]
если вы хотите найти только первого ребенка:
>>> soup.select_one('li.test > a') <a>link1</a>