我正在尝试创建一个函数,告诉我文本中每个单词的标记类。
我的HTML是这样的:
<p>
<span class="A">I am </span>
<span class="B"><span class="C"> not </span> doing a great job </span>
</p>
所以我想创建一个返回列表的函数:
[["I", A], ["am", A], ["not", C], ["doing", B], ["a", B], ["great", B], ["job", B]]
我试图用FindAll('span',recursive = False)循环所有跨度,并检查每个跨度是否有孩子,但我总是得到双打。 例如,我会“做得不好”和“不做”。
for p in p_tags:
my_tag_list = []
spans = p.findAll("span", recursive=False)
for s in spans:
text = s.text.split()
for t in text:
my_tag = []
my_tag.append(t)
my_tag.append(s["class"][0])
我查看了文档,但我似乎没有找到任何方法来获取文本及其周围的直接范围。
提前感谢您的帮助, 亲切的问候
答案 0 :(得分:0)
您可以通过find_all(text=True)
遍历文本节点,上到树并获取.parent
的class属性:
from bs4 import BeautifulSoup
data = """
<p>
<span class="A">I am </span>
<span class="B"><span class="C"> not </span> doing a great job </span>
</p>"""
soup = BeautifulSoup(data, "html.parser")
result = []
for text in soup.p.find_all(text=True):
parent = text.parent
parent_class = parent["class"][0] if "class" in parent.attrs else ""
for word in text.split():
result.append([word, parent_class])
print(result)
打印:
[[u'I', u'A'], [u'am', u'A'], [u'not', u'C'], [u'doing', u'B'],
[u'a', u'B'], [u'great', u'B'], [u'job', u'B']]