首页 文章

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

提问于
浏览
1

我想在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) . 我不能't know how to extract ' - ' between the second and the third span tags. Also, a total number of span tags may vary and ' - '可以在任何span标签之间 . 我写的代码只给我:3-乙酰基-4-乙酰基-5-(β . 这是我的代码的一部分:

p = soup.find("p")
name = ""
for child in p.children:
    if child.name == "span":
        name += child.text
print name

任何帮助都非常感谢!

5 回答

  • 1

    你可以使用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

    试试这样:

    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
    
  • 0

    你可以做点什么

    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

    您可以使用BeautifulSoup的 .findAll(text=True) 获取元素内的所有文本,包括 Span 之外的文本 . 这将返回一个文本部分列表,需要删除空格和引号 . 我'm not sure what rule you'用于排除最后的 "("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'
    
  • 1

    如果你喜欢单行,你可以这样做:

    (your_item.find("p", {"attr": "value"})).find("span").get_text()
    

相关问题