Python:使用Beautifulsoup从多个td获取值并且没有标记

时间:2017-11-22 12:05:34

标签: python html web-scraping beautifulsoup

我有一个看起来像这样的页面。

<tr>
    <th class="fst" scope="col">time(*)</th>
    <th scope="col">field</th>
    <th scope="col">1 session</th>
    <th scope="col">2 session</th>
    <th scope="col">3 session</th>
    <th scope="col">4 session</th>
    <th scope="col">5 session</th>
    <th scope="col">6 session</th>
</tr>
<tr>
   <th class="num_area" rowspan="11" scope="row">77</th>
   <td class="txt_category">bus</td>
   <td>58456</td>                                                                   
   <td>62891</td>                                                                    
   <td>63076</td>                                                             
   <td>53282</td>                                                                 
   <td>54805</td>                                                             
   <td>55097</td>
</tr>
<tr>
   <td class="txt_category">taxi</td>
   <td>-</td>
   <td>-</td>
   <td>-</td>
   <td>62891</td>
   <td>-</td>
   <td>-</td>
</tr>
<tr>                         
    <th class="fst" scope="col">time(*)</th>
    <th scope="col">field</th>
    <th scope="col">7 session</th>
    <th scope="col">8 session</th>
    <th scope="col">9 session</th>
    <th scope="col">10 session</th>
    <th scope="col">11 session</th>
    <th scope="col">12 session</th>
</tr>
<tr>
   <th class="num_area" rowspan="11" scope="row">100</th>
   <td class="txt_category">bus</td>
   <td>1342</td>                                                                   
   <td>138470</td>                                                                    
   <td>878840</td>                                                             
   <td>7653</td>                                                                 
   <td>4422</td>                                                             
   <td>87630</td>
</tr>

正如你所看到的,这个网站有一个表,其中有许多没有类或标签,并且有很多和。由于该值与会话不同,因此我必须废弃会话和值对等数据。 此外,字段名称是不同的(公共汽车,出租车..)我也必须得到这些名称。 理想的结果就是这样。

 result=[
   {session=1, scope=77, fieldname=bus, count=58456}, 
   {session=1, scope=77, fieldname=taxi, count=0},
   {session=2, scope=77, fieldname=bus, count=62891},
 ]

所以我到目前为止尝试了这样的事情。

def scraping():
    driver = webdriver.PhantomJS()
    driver.get(url)
    soup = BeautifulSoup(driver.page_source, 'html5lib')
    result = []
    for row in soup.findAll('tr'):
       header = row.findAll('th')
       if len(header) < 1:
           continue
       if len(header) == 7:
           for num in range(1, 7):
               date = header[num].find(text=True)

       if len(header) == 8:
           for num in range(1, 8):
               date = header[num].find(text=True)
       body = row.findAll('td')
       if len(body) < 1:
           continue
       field_name = body[0].find(text=True)
       template['field_name'] = field_name
       for num in range(1, 7):
           cost = body[num].find(text=True)
           template['cost'] = cost
       result.append(template)

有时长度是7,有时是8,所以我决定使用范围。但是,在使用它之后,似乎结果列表只有一个不是我想要的字典。我想知道是否有好办法废除这些价值观。

0 个答案:

没有答案