如何通过查找该标记内的标记来提取标记中的信息?

时间:2018-03-14 02:51:00

标签: python html parsing beautifulsoup tags

假设我想在每集节目中提取24分钟或在评级下提取N13信息。现在这只是代码的一部分,而某些span标记不包含dark_text类,而是其他内容。但是当我查找持有评级的标签时,当我找到它时,我无法提取它的评分,因为N13现在位于div标签下,而不是span,但是我正在寻找'评级'或'持续时间'我必须寻找'span'标签。并且美丽的汤不允许您findAll('div').findAll('span', {'class':'...'}),因此如果找到我正在寻找的div标记,我将无法返回span标记。

当我执行for循环时,会打印出所有这些额外的None以及其他内容。 任何人都有关于如何解析这个问题的任何提示?

问题实际上就是如何查找位于<span>标记下的div标记中的内容,但一旦找到,则提取整个div标记,或者最好甚至是仅在div标记中,但不在span标记中?事实证明这比我预想的要复杂得多。

from bs4 import BeautifulSoup
x= '''<div>
<a href="javascript:void(0);" onclick="$('#score143583').toggle()">Overall Rating</a>:
    2
  </div>
  <div class="spaceit">
  <span class="dark_text">Duration:</span>
    24 min. per ep.
    </div>
  <div>
  <span class="dark_text">Rating:</span>
    N13
    </div>'''


bs = BeautifulSoup(x, 'html.parser')

1 个答案:

答案 0 :(得分:0)

您可以使用next_sibling方法获取位于span标记之后的文字。要获取span标记,您可以使用find('span', class_='dark_text', text='Duration:')

创建一个简单的函数,你可以使用它:

def get_next_text(soup, text):
    return soup.find('span', class_='dark_text', text=text).next_sibling

soup = BeautifulSoup(html, 'lxml')
duration = get_next_text(soup, 'Duration:')
print('Duration:', duration.strip())
rating = get_next_text(soup, 'Rating:')
print('Rating:', rating.strip())

输出:

Duration: 24 min. per ep.
Rating: N13

如果您想获得包含所需文字的整个div标记,可以使用.parent

def get_parent(soup, text):
    return soup.find('span', class_='dark_text', text=text).parent

soup = BeautifulSoup(html, 'lxml')
duration = get_parent(soup, 'Duration:')
print(duration)
rating = get_parent(soup, 'Rating:')
print(rating)

输出:

<div class="spaceit">
<span class="dark_text">Duration:</span>
    24 min. per ep.
</div>
<div>
<span class="dark_text">Rating:</span>
    N13
</div>