我想在span标签之间提取数据。以下是html代码的示例:
<p>
<span class="html-italic">3-Acetyl-</span>
<span class="html-italic">(4-acetyl-5-(β</span>
"-"
<span class="html-italic">naphtyl)-4,5-dihydro-1,3,4-oxodiazol-2-yl)methoxy)-2H-chromen-2-one</span>
"("
<b>5b</b>
</p>
我需要一个全名:
3-Acetyl-4-acetyl-5-(β-naphtyl)-4,5-dihydro-1,3,4-oxodiazol-2-yl)methoxy)-2H-chromen-2-one
(没有5b)。我不知道如何在第二个和第三个span标签之间提取“ - ”。此外,跨度标签的总数可能会有所不同,“ - ”可以在任何跨度标签之间。我写的代码只给我:3-乙酰基-4-乙酰基-5-(β。这是我的代码的一部分:
p = soup.find("p")
name = ""
for child in p.children:
if child.name == "span":
name += child.text
print name
非常感谢任何帮助!
答案 0 :(得分:3)
您可以使用CSS selectors。
>>> ''.join(i.text for i in soup.select('p > span'))
'3-Acetyl-(4-acetyl-5-(βnaphtyl)-4,5-dihydro-1,3,4-oxodiazol-2-yl)methoxy)-2H-chromen-2-one'
答案 1 :(得分:1)
尝试这样:
name=""
for x in soup.find('p'):
try:
if x.name == 'span':
name += x.get_text()
except:pass
print name
输出:
3-Acetyl-(4-acetyl-5-(βnaphtyl)-4,5-dihydro-1,3,4-oxodiazol-2-yl)methoxy)-2H-chromen-2-one
答案 2 :(得分:1)
你可以做一些像
这样的事情p = soup.find("p")
name = ""
for child in p.children:
if child.name == "span":
name += child.text
elif child.name is 'None':
name += child.string.rstrip("\"\n ").lstrip("\"\n ")
print name
答案 3 :(得分:1)
您可以使用BeautifulSoup的.findAll(text=True)
来获取元素内的所有文本,包括跨度之外的文本。这将返回一个文本部分列表,需要删除空格和引号。我不确定你用什么规则来排除最后一个"("5b
,但也许它就像切片一样简单:
parts = soup.find("p").findAll(text=True)
name = ''.join(p.strip(string.whitespace + '"') for p in parts[:-3])
结果:
u'3-Acetyl-(4-acetyl-5-(β-naphtyl)-4,5-dihydro-1,3,4-oxodiazol-2-yl)methoxy)-2H-chromen-2-one'
答案 4 :(得分:0)
如果您喜欢单行,您可以执行以下操作:
(your_item.find("p", {"attr": "value"})).find("span").get_text()