用BeautifulSoup和Python提取span标签之间的数据

2 投票
5 回答
9718 浏览
提问于 2025-05-01 17:27

我想从标签之间提取数据。这里有一段示例的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)。我不知道怎么提取第二个和第三个标签之间的'-'。而且,标签的总数可能会有所不同,'-'也可能出现在任何标签之间。我写的代码只给我返回了:3-Acetyl-4-acetyl-5-(β。以下是我代码的一部分:

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

任何帮助都非常感谢!

暂无标签

5 个回答

1

如果你喜欢一行代码的写法,可以试试这样:

(your_item.find("p", {"attr": "value"})).find("span").get_text()
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

你可以这样做:

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
2

你可以使用BeautifulSoup的.findAll(text=True)方法来获取元素内的所有文本,包括那些在span标签外的文本。这会返回一个文本部分的列表,你需要把这些文本中的空格和引号去掉。我不太清楚你是用什么规则来排除最后的"("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'
3

你可以使用 CSS选择器

>>> ''.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'

撰写回答