Python BeautifulSoup - 获取没有子元素的元素

时间:2015-11-26 16:17:14

标签: javascript jquery python html beautifulsoup

示例HTML:

<p class="labels">
  <span>Item1</span>
  <span>Item2</span>
  <time class="time">
    <span>I dont want to get this span</span>
  </time>
</p>

我目前正在使用labels类获取标记内的所有跨度,但我只想直接在labels类下获得2个跨度,我不想得到任何{{1来自子元素的标记。

目前我这样做很明显:

首先,我从一个更大的HTML获取标签HTML:

span

然后我从中提取span标签。

labels = html.findAll(_class="labels")

在我的情况下,spans = labels[0].findAll('span', {"class": None} 不会改变任何内容,因为没有span标签有任何类。

所以我的问题是,我怎样才能获得没有所有子元素的前2个span标签?

3 个答案:

答案 0 :(得分:2)

for container in html.findAll(_class="labels"):
    spans = container.findAll('span', {"class": None})
    spans = [span for span in spans if span.parent is container]

或者迭代.children

for container in html.findAll(_class="labels"):
    filter = lambda c: c.name == 'span' and c.class_ == None
    spans = [child for child in container.children if filter(child)]

答案 1 :(得分:2)

BeautifulSoup文档中有一句话可以找到recursive = False

所以关于这个问题的答案是:

spans = labels[0].findAll('span', {"class": None}, recursive=False)

答案 2 :(得分:0)

要提取前两个span元素,请尝试以下

>>>[i.text for i in html.find('p',{"class":"labels"}).findAll('span', {"class": None})[0:2]]
>>>[u'Item1', u'Item2']

如果你想获取课程span内的所有labels,请删除片段 -

>>>[i.text for i in html.find('p',{"class":"labels"}).findAll('span', {"class": None})]
>>>[u'Item1', u'Item2', u'I dont want to get this span']
相关问题