2014-11-05 5 views
1

Я хотел бы извлечь данные между тегами span. Вот пример кода HTML:извлечение данных между тегами span с помощью BeautifulSoup Python

<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 (без 5б). Я не знаю, как извлечь '-' между вторым и третьим тегами span. Кроме того, общее количество тегов span может варьироваться, а «-» может быть между любыми тегами span. Код, который я написал дает мне только: 3-ацетил-4-ацетил-5- (β Вот часть моего кода:.!

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

Любая помощь высоко ценится

ответ

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' 
+0

Это пропускающей '«-». 'вне пролеты (должны быть β-нафтилом). –

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

вы также должны лишить кавычки из «-» и «(» использовать rstrip и lstrip – conrad

+0

вы можете делать то, что отметить в этом – Hackaholic

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

Если вы хотите остроты, вы может сделать что-то вроде:

(your_item.find("p", {"attr": "value"})).find("span").get_text() 
Смежные вопросы