Python:未能使用BeautifulSoup获取所有<span>标记中的所有文本

时间:2016-03-29 14:49:15

标签: python html beautifulsoup

我已经查看了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个问题。 第一个是我在结果中得到了双DirectorActor,因为它们位于2个span标记中。第二个问题是我无法在<br>标记之前获取文本。我不想使用以下代码:

soup.find("span", text="Language:").next_sibling

因为对于每个br标签我需要将该代码添加到我的项目中,这很烦人。 你有一些优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果你想写一些通用的东西,你仍然需要找到包含next_siblingfind_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