用BeautifulSoup和Python提取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)。我不知道怎么提取第二个和第三个标签之间的'-'。而且,标签的总数可能会有所不同,'-'也可能出现在任何标签之间。我写的代码只给我返回了: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'