2012-12-10 20 views
0

我實在想不出一個像樣的標題中以得到什麼,我試圖做一個概述,但我有例子應該解釋好聽,我公司提供一個在線時間表,但他們沒有任何API或任何提取它,所以我使用Python框架Scrapy來刮取數據,然後將其添加到我的Google日曆正則表達式處理一次或兩次可能發生的

一個女孩給了我一個正則表達式行處理數據,因爲它是踢我的屁股了幾天,她感覺不錯,但因爲我已經意識到,它不處理拆分移(最有可能的,因爲我沒有安排任何所以她沒看到一個可能性)

我的正則表達式是

re.findall("""dow1'>(\w+)<\S+?>(\w+ \d+)</td>\s*<td class.*?tlHours'>(\d+).*?span>\s*(\d+)<span.*?ment'>(.*?)</spa.*?Meal: (.*?)</sp.*?start'>(\S+?)</spa.*?end'>(\S+?)<""", response.body) 

實施例的數據:

這是一個正常的8小時工作日與用膳,這是細處理:

<tr> 
    <td class='dt'> 
     <span class='dow1'>Sunday</span>Dec 09 
    </td> 
    <td class='ScheduledDetails'valign='top'> 
     <div style="position:relative;"> 
      <span class='tlHours'>8<span class='spart'> hrs</span> 0<span class='spart'> mins</span></span><span class='department'>Cashier</span><span class='meal'>Meal: 2pm - 3pm</span> 
     </div> 
    </td> 
    <td> 
     &nbsp; 
    </td> 
    <td class='Schedunderlay'> 
     <div class='Sched'> 
      <div class='schedbar' style='left: 143px; width: 234px;'> 
       <div class='schedbar_l'></div> 
       <div class='schedbar_m' style='width: 226px;'> 
        <span class='start'>10am</span><span class='end'>7pm</span> 
       </div> 
       <div class='schedbar_r'></div> 
      </div> 
      <div class='availbar' style='left: 9px; width: 498px; display: none;'> 
       <div class='schedbar_l'></div> 
       <div class='schedbar_m' style='width: 490px;'> 
        <span class='start'><img src='/Images/Schedule/arrowLeft.gif' alt='' style='margin-left:5px; margin-top:2px;' /></span> 
        <div class='OTtext' align='center'>All Day</div> 
        <span class='end'></span> 
       </div> 
       <div class='schedbar_r'></div> 
      </div> 
      <div class='availbar' style='left: 508px; width: 216px; display: none;'> 
       <div class='schedbar_l_on'></div> 
       <div class='schedbar_m_on' style='width: 208px;'><span class='start'></span> 
        <div class='OTtext' align='center'>All Day</div> 
        <span class='end'><img src='/Images/Schedule/arrowRight.gif' alt='' style='margin-left:5px; margin-top:2px;' /></span> 
       </div> 
       <div class='schedbar_r_on'></div> 
      </div> 
     </div> 
    </td> 
    <td>&nbsp;</td> 
    <td class='rightColDetails'> 
     <div class='AvailDetails' align='left' style='display: table-cell;'> 
      <span class='iefix'><b>Avail - All Day</b></span><br/> 
      <span style='font-size: 11px;'>Pref - All Day</span> 
     </div> 
    </td> 
</tr> 

而且這是一個分裂移,兩個四小時輪班分離通過一個空的1小時插槽(他們這樣做來欺騙得分系統,兩個被覆蓋的轉換而不是一個):

<tr> 
    <td class='dt'> 
     <span class='dow1'>Thursday</span>Dec 13 
    </td> 
    <td class='ScheduledDetails' valign='top'> 
     <div style="position:relative;"> 
      <span class='tlHours'>8<span class='spart'> hrs</span> 0<span class='spart'> mins</span></span><span class='department'>Cashier</span><span class='meal'>Meal: None</span> 
     </div> 
    </td> 
    <td>&nbsp;</td> 
    <td class='Schedunderlay'> 
     <div class='Sched'> 
      <div class='schedbar' style='left: 247px; width: 104px;'> 
       <div class='schedbar_l'></div> 
       <div class='schedbar_m' style='width: 96px;'> 
        <span class='start'>2pm</span><span class='end'>6pm</span> 
       </div><div class='schedbar_r'></div> 
      </div> 
      <div class='schedbar' style='left: 377px; width: 104px;'> 
       <div class='schedbar_l'></div> 
       <div class='schedbar_m' style='width: 96px;'> 
        <span class='start'>7pm</span> <span class='end'>11pm</span> 
       </div> 
       <div class='schedbar_r'></div> 
      </div> 
      <div class='availbar' style='left: 9px; width: 498px; display: none;'> 
       <div class='schedbar_l'></div><div class='schedbar_m' style='width: 490px;'> 
        <span class='start'><img src='/Images/Schedule/arrowLeft.gif' alt='' style='margin-left:5px; margin-top:2px;' /></span> 
        <div class='OTtext' align='center'>All Day</div> 
        <span class='end'></span> 
       </div> 
       <div class='schedbar_r'></div> 
      </div> 
      <div class='availbar' style='left: 508px; width: 216px; display: none;'> 
       <div class='schedbar_l_on'></div> 
       <div class='schedbar_m_on' style='width: 208px;'> 
        <span class='start'></span> 
        <div class='OTtext' align='center'>All Day</div> 
        <span class='end'><img src='/Images/Schedule/arrowRight.gif' alt='' style='margin-left:5px; margin-top:2px;' /></span> 
       </div> 
      <div class='schedbar_r_on'></div> 
     </div> 
    </div> 
    </td> 
    <td>&nbsp;</td> 
    <td class='rightColDetails'> 
     <div class='AvailDetails' align='left' style='display: table-cell;'> 
      <span class='iefix'><b>Avail - All Day</b></span><br/><span style='font-size: 11px;'>Pref - All Day</span> 
     </div> 
    </td> 
</tr> 

重要的區別是經常轉變有一個開始和一個結束時間,與分裂轉變有一個開始,結束和開始,並且結束...。

我一直對我的頭撞擊現在五個小時左右......也可以毫無進展,我想我有更多的運氣,如果我的理解正則表達式..任何幫助都將不勝感激......

+2

如果你想** **的人來幫助你,需要一些時間來_format您code_。 – Daedalus

+4

嘗試使用像美麗的湯一樣的html解析器。 – pogo

+0

不要使用正則表達式來解析html。使用美麗的湯。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – devsnd

回答

1

下面是一個使用BeautifulSoup解析的解決方案該文件並獲取信息。

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html) 

for schedbar in soup.find_all('div', 'schedbar'): 
    print "start: " + schedbar.find('div', 'schedbar_m').find('span', 'start').string 
    print "end: " + schedbar.find('div', 'schedbar_m').find('span', 'end').string 

輸出:

start: 2pm 
end: 6pm 
start: 7pm 
end: 11pm 
+0

我完全理解你們爲什麼建議美麗的湯。 – Valalvax

+0

是的,這對於HTML解析是非常方便的。 – jpgunter