解析网页以提供给Telegram Telegraph create_page

时间:2017-04-30 11:38:53

标签: python-3.x beautifulsoup html-parsing telegram-bot

我'制作一个Telegram机器人,通过Telegram" Telegraph"提供网页服务。服务,这样我就可以通过即时加载来阅读页面。

因此,我可以节省移动数据并放弃烦人的广告。

因此,我需要一种方法将任何网页都提供给this library的createPage方法。

问题是网页可以包含任何标签,而电报只支持这些Html标签。

ALLOWED_TAGS = [
    'a', 'aside', 'b', 'blockquote', 'br', 'code', 'em', 'figcaption', 'figure',
    'h3', 'h4', 'hr', 'i', 'iframe', 'img', 'li', 'ol', 'p', 'pre', 's',
    'strong', 'u', 'ul', 'video'
]

由于我是初学者,在此之前我曾经尝试了很多。

我尝试使用Beautifulsoup get_text方法,但它修剪了所有标记。 这让我感到困扰,因为我仍然希望保留一些内容,例如<img><a><b>,因为我仍希望能够看到图像和链接。

我也尝试使用python html.parser,但我无法入侵它。

我也试过了一些在线服务,比如Mercury Spotlight Parser。 不错的服务,但它仍然保留了一些不需要的标签,如<div>。 我已经做了一些黑客来摆脱这些,但我认为这项服务是不行的,因为它给了我unicode&#34;字符未找到&#34;解析德语变音字符时的(u + FFFD),如Möglichkeit

我理想的解决方案是一个函数,它将ALLOWED_TAGS作为白名单,然后修剪不在此列表中的所有html标记。

这样的库/函数是否存在?

我在Ubuntu上使用Python3。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果这些函数(及其中的元素)在allowed_tags列表

中,则此函数应返回所有唯一的html元素
def allowedTags(soup, allowed_tags):
    tags = []
    for tag in soup.find_all(allowed_tags) : 
        if all(t.name in allowed_tags for t in tag.find_all()) : 
            if tag not in tags and not any(str(tag) in str(t) for t in tags if t != tag) : 
                tags += [tag]
    return tags

请注意,对于大页面来说这可能会非常慢(此页面为4.5秒)
我尝试使用tag.children将时间减少到0.5秒,但我无法获得准确的结果