2017-03-05 49 views
1

我正在製作一個Kodi插件,我將在我的覆盆子pi3上運行。 在我的插件中,我從一個網站刮信息,所以我可以填寫一個項目列表。我現在所擁有的一切都在工作,但是當我將它部署在我的樹莓派3上時,性能就成了一個問題。網頁解析需要15秒Beautifulsoup4 performance raspberry pi3

soup = BeautifulSoup(response, "html.parser", parse_only=tiles) << this line 

我已經使用soupstrainer來提高性能,但這並沒有我所期待的影響。

_VRT_BASE = "https://www.vrt.be/" 

    def __list_videos_az(self): 
    joined_url = urljoin(self._VRTNU_BASE_URL, "./a-z/") 
    response = urlopen(joined_url) 
    tiles = SoupStrainer('a', {"class": "tile"}) 
    soup = BeautifulSoup(response, "html.parser", parse_only=tiles) 
    listing = [] 
    for tile in soup.find_all(class_="tile"): 
     link_to_video = tile["href"] 
     li = self.__get_item(tile, "false") 
     url = '{0}?action=getepisodes&video={1}'.format(_url, link_to_video) 
     listing.append((url, li, True)) 

    xbmcplugin.addDirectoryItems(_handle, listing, len(listing)) 
    xbmcplugin.addSortMethod(_handle, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) 
    xbmcplugin.endOfDirectory(_handle) 

def __get_item(self, element, is_playable): 
    thumbnail = self.__format_image_url(element) 
    found_element = element.find(class_="tile__title") 
    li = None 
    if found_element is not None: 
     li = xbmcgui.ListItem(found_element.contents[0] 
           .replace("\n", "").strip()) 
     li.setProperty('IsPlayable', is_playable) 
     li.setArt({'thumb': thumbnail}) 
    return li 

有人能告訴我如何提高程序的性能嗎?我在想也許一個正則表達式會更快,但是很多人說你不應該用這種方式解析html,並且把正則表達式放在一起也是一個挑戰。

那麼有什麼我可以做的,以提高我的表現?

回答

1

我建議嘗試lxml parser這是寫在C(實際上Cython)和通常更快。要獲得此包,請嘗試從Raspbian(apt-get install python-lxmlpip install lxml)安裝它,然後將其移至您的插件。 lxml包中包含已編譯的二進制模塊,因此爲特定平臺獲取版本很重要。

+0

感謝您的回答,我已經嘗試過查看lxml解析器,但發現很難使其工作。但我認爲最後我改變了時間,颳了需要3秒和for循環15.因爲我把一個正則表達式,我認爲應該是最快的?最後它還是很慢,因爲我添加了很多listitems。我認爲它與bug#17304相關http://trac.kodi.tv/ticket/17304。現在我正在等待librelec更新,然後再編程/測試更多。 (也可以從addon.py中分離出更多的代碼,就像其他人說的那樣) – Martijn

+0

我並不是指直接使用'lxml',我的意思是將它用作BeautifulSoup 4的樹構建器/解析器。並且我不建議使用正則表達式用於複雜的html解析。至於這個錯誤,Kodi開發團隊正在修復它。 –

+0

不好好考慮!對於我來說,在我的覆盆子pi上部署它,我需要一個帶有kodi 17.1版本的新版本的libreelec – Martijn

0

我懷疑你只有一個文件?首先可能會將該代碼移出主文件。一般guidline將保持addon.xml引用的文件可能的最小值,因爲它是唯一沒有被編譯器緩存的文件。