使用BeautifulSoup Python在span标记之间提取数据

时间:2014-11-05 04:09:59

标签: python beautifulsoup

我想在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

非常感谢任何帮助!

5 个答案:

答案 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()