我的代码:
<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
任何帮助?
答案 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
答案 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