如何使用Python和Beautiful Soup获取HTML中标签和其结束之间的内容?

2024-10-03 04:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个HTML行,如下所示:

<span class="cd__headline-text">Is this model too thin for Yves Saint Laurent? </span>

我想摘录一下标题,即“这个模型对伊夫·圣罗兰来说太薄了吗?”从这个HTML行。我怎样才能获得

^{pr2}$

我对regex不太熟悉。在


Tags: textformodelishtmlcdthisclass
2条回答

不应该使用正则表达式,而应该使用诸如beauthoulsoup之类的html解析器。您还可以将etree库与xpath一起用于复杂的用例。在

不过,如果你想用正则表达式-

正则表达式是一种特定于域的语言,它使字符串解析和处理更加容易。虽然,有些人可能不同意正则表达式提供了许多优雅的解决方案,但字符串上的循环可能永远是。-

import re
html_string = '<span class="cd__headline-text">Is this model too thin for Yves Saint Laurent? </span>'
regex = re.compile(r'(?<=>).*(?=<)')
result = regex.findall(html_string)[0]

在这个正则表达式中,我使用了正则表达式的look ahead和look behind。 就学习正则表达式而言,它需要相当多的时间。我建议你去读一些关于regex的好教程或书。在

如果元素只包含文本,请使用^{} attribute

headline = soup.find(class_='cd__headline-text')
print(headline.string)

如果包含其他标记,则可以获取当前元素中包含的所有文本,或者只获取当前元素中的特定文本。在

^{} function将递归并收集元素和子元素中的所有字符串,将它们与您选择的字符串连接起来(默认为空字符串),并使用或不使用空格剥离。在

要只获取特定的字符串,可以遍历^{} or ^{} generators,或者使用element contents访问所有包含的元素,然后选择NavigableString类型的实例。在

示例演示:

^{pr2}$

并添加了一个附加元素:

>>> markup = '<span class="cd__headline-text">Is this model <em>too thin</em> for Yves Saint Laurent? </span>'
>>> soup = BeautifulSoup(markup)
>>> headline = soup.find(class_='cd__headline-text')
>>> headline.string is None
True
>>> print list(headline.strings)
[u'Is this model ', u'too thin', u' for Yves Saint Laurent? ']
>>> print list(headline.stripped_strings)
[u'Is this model', u'too thin', u'for Yves Saint Laurent?']
>>> print headline.get_text()
Is this model too thin for Yves Saint Laurent? 
>>> print headline.get_text(' - ', strip=True)
Is this model - too thin - for Yves Saint Laurent?
>>> headline.contents
[u'Is this model ', <em>too thin</em>, u' for Yves Saint Laurent? ']
>>> from bs4 import NavigableString
>>> [el for el in headline.children if isinstance(el, NavigableString)]
[u'Is this model ', u' for Yves Saint Laurent? ']

相关问题 更多 >