BeautifulSoup - 无需课程即可获得h2文本

时间:2016-04-15 15:30:21

标签: python html beautifulsoup

我的代码:

<div id="title">
<h2>
My title <span class="subtitle">My Subtitle</span></h2></div>

如果我使用此代码:

title = soup.find('div', id="title").h2.text
print title
>> My title My Subtitle

它匹配一切。我想将我的标题和我的副标题匹配为两个不同的对象:

print title 
>> My title
print subtitle
>> My subtitle

任何帮助?

4 个答案:

答案 0 :(得分:1)

您可以单独获取副标题及其preceding sibling

title = soup.find('div', id="title").h2
subtitle = title.find(class_="subtitle")
print(subtitle.previous_sibling.strip(), subtitle.get_text())

或者,您可以在非递归模式下找到文本节点:

title = soup.find('div', id="title").h2
print(title.find(text=True, recursive=False).strip(), 
      title.find(class_="subtitle").get_text(strip=True))

两者都打印:

(u'My title', u'My Subtitle')

答案 1 :(得分:0)

不使用class属性的一种方法是:

h2 = soup.find('div', id="title").h2
subtitle = h2.span.text
title = str(h2.contents[0])

h2.contents[0]会在此处返回NavigableString个对象。它的打印行为与它的字符串版本相同。如果您只打算使用print语句,则无需str()调用。

答案 2 :(得分:0)

查看此示例以了解

from bs4 import BeautifulSoup

#html source
html_source = '''
<div class="test">
     <h2>paragraph1</h2>
</div>
'''

soup = BeautifulSoup(html_source, 'html.parser')
#find h2 tag
print(soup.h2.string)

输出

paragraph1

link

答案 3 :(得分:0)

另一种解决方案。

from simplified_scrapy import SimplifiedDoc
html = '''
<div id="title">
<h2>
My title <span class="subtitle">My Subtitle</span></h2></div>
'''
doc = SimplifiedDoc(html)
h2 = doc.select('div#title').h2
print ('title:',h2.firstText())
print ('subtitle:',h2.span.text)

结果:

title: My title
subtitle: My Subtitle