bs4:区分文本和HTML元素

时间:2018-04-02 10:36:30

标签: python html beautifulsoup

我正在尝试分离XSS-payloads以使用不同的方法分析它们的结构。 示例有效负载如下所示:

<picture><source srcset="x"><img onerror="***payload***"></picture>

现在我需要分开不同的部分以获得以下输出:

  

图片来源srcset x img onerror *** payload ***

我的问题是,有时负载包含文本内容,有时还包含另一个HTML元素(如示例中所示)作为内容。如果我只是追加“上层”HTML元素的内容,输出就会出错,因为我会再次遍历该元素。

我的代码看起来像这样:

for x in self.normalized_payloads:
tmp = []
soup = BeautifulSoup(x, 'html.parser')
elements = soup.find_all()
for y in elements:
    tmp.append(y.name)
    for u in y.attrs.keys():    
        tmp.append(u)
        tmp.append(y.attrs[u])
seperated_payloads.append(tmp)

如何区分文本和另一个HTML元素作为HTML元素的内容?您是否有其他方法可以获得此输出,而无需迭代有效负载的每个HTML元素?

1 个答案:

答案 0 :(得分:0)

所以,事实证明我提出了一个有效的解决方案:

if len(BeautifulSoup(y.decode_contents(formatter="html"),'html.parser').find_all()) == 0 and y.decode_contents(formatter="html") != "":
    tmp.append(y.decode_contents(formatter="html"))

此代码检查子元素是否是可解析的HTML元素或仅是文本。