我想使用BeautifulSoup4从lokal保存的网站(python文档)中获取不同的内容(类),所以我使用此代码执行此操作(index.html是此保存的网站:https://docs.python.org/3/library/stdtypes.html)
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
f = open('test.html','w')
f.truncate
classes= soup.find_all('dl', attrs={'class': ['class', 'method','function','describe', 'attribute', 'data', 'clasmethod', 'staticmethod']})
print(classes,file=f)
f.close()
filehandler仅用于结果输出,对问题本身没有影响。
我的问题是结果是嵌套的。例如,方法“__eq__(exporter)将在类内部找到1.并且2.作为独立的方法。
所以我想删除其他结果中的所有结果,以使每个结果都在同一层次结构上。我怎样才能做到这一点?或者甚至可以在第一步中“忽略”该内容?我希望你明白我的意思。
答案 0 :(得分:1)
您不能告诉find
忽略嵌套的dl
元素;您所能做的只是忽略.descendants
:
matches = []
for dl in soup.find_all('dl', attrs={'class': ['class', 'method','function','describe', 'attribute', 'data', 'clasmethod', 'staticmethod']})
if any(dl in m.descendants for m in matches):
# child of already found element
continue
matches.append(dl)
如果您想要嵌套元素而没有父母,请使用:
matches = []
for dl in soup.find_all('dl', attrs={'class': ['class', 'method','function','describe', 'attribute', 'data', 'clasmethod', 'staticmethod']})
matches = [m for m in matches if dl not in m.descendants]
matches.append(dl)
如果您想从树中拆开树并删除元素,请使用:
matches = soup.find_all('dl', attrs={'class': ['class', 'method','function','describe', 'attribute', 'data', 'clasmethod', 'staticmethod']})
for element in matches:
element.extract() # remove from tree (and parent `dl` matches)
但您可能需要调整文本提取。