解析文本除以<但不在<span>内

时间:2015-08-23 09:17:15

标签: python html parsing web-scraping beautifulsoup

我无法弄清楚如何解析这类数据:

<div id="tabs-1" class="ui-tabs-panel ui-widget-content ui-corner-bottom">



            <strong><span itemprop="name">MOS-SCHAUM</span></strong><br>
        <span itemprop="description">Antistatická pena čierna na IO 300x300x6mm</span>


        <br>RoHS: Áno           
        <br>Obj.číslo: 13291<br>



        </div>

代码段中可能有很多<span>个标签 - 我不想得到它们。我只想要那些不在<span>标签内的人。

结果将是:

{'RoHS':'Áno',
 'Obj.číslo': '13291'}

我正在考虑.contents,但这是一个非常难以预测的元素将在哪个索引上。

你知道怎么做吗?

编辑: 即使我试试这个:

detail_table = soup.find('div',id="tabs-1")                              
itemprops = detail_table.find_all('span',itemprop=re.compile('.+'))      
for item in itemprops:                                                   
    data[item['itemprop']]=item                                          

contents = detail_table.contents[-1].contents[-1].contents[-1].contents

for i,c in enumerate(contents):
print c                    
print '---'   

我明白了:

RoHS: Áno           
                                 # 1st element
---
<br>Obj.�íslo: 68664<br>
</br></br>                        # 2st element
---

EDIT2:我刚刚找到一个解决方案,但它并不是很好。必须有一个更优雅的解决方案:

def get_data(url):                                                                 
    data = {}                                                                      
    soup = get_soup(url)                                                           

    """ TECHNICAL INFORMATION """                                                  
    tech_par_table = soup.find('div',id="tabs-2")                                  
    trs = tech_par_table.find_all('tr')                                            
    for tr in trs:                                                                 
        tds = tr.find_all('td')                                                    
        parameter = tds[0].text                                                    
        value = tds[1].text                                                        
        data[parameter]=value                                                      

    """ DETAIL """                                                                 
    detail_table = soup.find('div',id="tabs-1")                                    
    itemprops = detail_table.find_all('span',itemprop=re.compile('.+'))            
    for item in itemprops:                                                         
        data[item['itemprop'].replace('\n','').replace('\t','').strip()]=item.text.

    contents = detail_table.contents[-1].contents[-1].contents[-1].contents        

    for i,c in enumerate(contents):                                                
        if isinstance(c,bs4.element.NavigableString):                              
            splitted = c.split(':')                                                
            data[splitted[0]]=splitted[1].replace('\n','').replace('\t','').strip()
        if isinstance(c,bs4.element.Tag):                                          
            splitted = c.text.split(':')                                           
            data[splitted[0]]=splitted[1].replace('\n','').replace('\t','').strip()

1 个答案:

答案 0 :(得分:0)

首先,您需要获取所有br标记并使用.next_element属性获取在每个br标记后立即解析的内容;在这里你的文字。

d = {}

for br in soup.find_all('br'):
    text = br.next_element.strip()
    if text:
        arr = text.split(':')
        d[arr[0]] = arr[1].strip()
print(d)

的产率:

{'Obj.číslo': '13291', 'RoHS': 'Áno'}