Beautifulsoup4 performance raspberry pi3

问题描述:

我正在制作一个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,并且把正则表达式放在一起也是一个挑战。

那么有什么我可以做的,以提高我的表现?

我建议尝试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

我怀疑你只有一个文件?首先可能会将该代码移出主文件。一般guidline将保持addon.xml引用的文件可能的最小值,因为它是唯一没有被编译器缓存的文件。