我已经查看了stackoverflow但仍未找到解决方案。 这是我需要处理的html文件:
......<span ><span class='pl'>Director </span>: <span class='attrs'><a href="/celebrity/1022571/" rel="v:directedBy">James</a></span></span><br/>
<span ><span class='pl'>Actor</span>: <span class='attrs'><a href="/celebrity/1022571/">Tom</a></span></span><br/>
<span class="pl">Countries:</span> USA <br/>
<span class="pl">Language:</span> English <br/>......
文件中有许多span
个标签。
这是我的代码:
from bs4 import BeautifulSoup
record=[]
soup=BeautifulSoup(html)
spans=soup.find_all('span')
for span in spans:
record.append(span.text)
我使用上面提到的代码,我遇到了2个问题。
第一个是我在结果中得到了双Director
和Actor
,因为它们位于2个span
标记中。第二个问题是我无法在<br>
标记之前获取文本。我不想使用以下代码:
soup.find("span", text="Language:").next_sibling
因为对于每个br
标签我需要将该代码添加到我的项目中,这很烦人。
你有一些优雅的解决方案吗?
答案 0 :(得分:1)
如果你想写一些通用的东西,你仍然需要找到包含next_sibling
或find_next_sibling
的下一个兄弟标记/文本节点。
以下是处理这两种情况的代码 - 当标签和文本节点之后有一个元素时:
soup = BeautifulSoup(html, "html.parser")
for label in soup.find_all("span", class_="pl"):
value = label.find_next_sibling("span", class_="attrs")
value = label.next_sibling.strip() if not value else value.get_text(strip=True)
label = label.get_text(strip=True).strip(":")
print(label, value)
打印:
Director James
Actor Tom
Countries USA
Language English