Beautifulsoup4性能覆盆子pi3

时间:2017-03-05 20:58:30

标签: python performance web-scraping beautifulsoup kodi

我正在制作一个Kodi插件,我将在我的覆盆子pi3上运行。 在我的插件中,我从网站上抓取信息,以便我可以填写项目列表。我现在拥有的一切都在工作,但是当我将它部署在我的覆盆子pi 3上时,性能就变成了问题。解析网页需要15秒

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

我已经使用了汤曲线来提高性能,但这并没有产生我所希望的影响。

    _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并将正则表达式放在一起也很有挑战性。

那么我有什么办法可以改善我的表现吗?

2 个答案:

答案 0 :(得分:1)

我建议尝试使用C语言编写的lxml parser(实际上是Cython)并且通常更快。要获取此程序包,请尝试从Raspbian(apt-get install python-lxmlpip install lxml)安装它,然后将其移至您的插件。 lxml包中包含已编译的二进制模块,因此获取特定平台的版本非常重要。

答案 1 :(得分:0)

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