BeautifulSoup可以找到非官方的HTML标签/属性

时间:2018-01-27 17:02:32

标签: python html beautifulsoup

在我的工作中,我们使用的是我们创建的标签。其中一个名为can-edit的标签,在代码中看起来像这样(例如):

<h1 can-edit="banner top text" class="mainText">some text</h1>
<h2 can-edit="banner bottom text" class="bottomText">some text</h2>

它可以在任何标签内(img,p,h1,h2,div ......)。

我希望获得的是页面中的所有可编辑标签,例如上面的HTML:

['banner top text', 'banner bottom text']

我试过

soup = BeautifulSoup(html, "html.parser")
can_edits = soup.find_all("can-edit")

但它找不到任何。

1 个答案:

答案 0 :(得分:6)

  

我试过

soup = BeautifulSoup(html, "html.parser")
can_edits = soup.find_all("can-edit")
     

但它找不到任何。

这不起作用的原因是因为在这里您查找名称为can-edit标记,因此<can-edit ...>,因此无效。

您可以使用汤的find_all功能查找具有特定属性的所有标签。例如:

soup.find_all(attrs={'can-edit': True})

所以我们在这里使用attrs参数并向其传递一个属性,该属性表示我们会过滤具有can-edit 属性的标记。这将为我们提供一个带有can-edit属性的标记列表(无论值是多少)。如果我们现在想要获取该属性的,我们可以得到它的['can-edit']项,这样我们就可以编写一个列表解析:

all_can_edit_attrs = [tag['can-edit']
                      for tag in soup.find_all(attrs={'can-edit': True})]

或完整的工作版本:

from bs4 import BeautifulSoup

s = """<h1 can-edit="banner top text" class="mainText">some text</h1>
<h2 can-edit="banner bottom text" class="bottomText">some text</h2>"""

bs = BeautifulSoup(s, 'lxml')

all_can_edit_attrs = [tag['can-edit']
                      for tag in soup.find_all(attrs={'can-edit': True})]