我试图从2012年奥巴马-罗姆尼总统辩论中摘录一些名言。问题是the site组织不好。所以结构看起来是这样的:
<span class="displaytext">
<p>
<i>OBAMA</i>Obama's first quotes
</p>
<p>More quotes from Obama</p>
<p>Some more Obama quotes</p>
<p>
<i>Moderator</i>Moderator's quotes
</p>
<p>Some more quotes</p>
<p>
<i>ROMNEY</i>Romney's quotes
</p>
<p>More quotes from Romney</p>
<p>Some more Romney quotes</p>
</span>
有没有办法选择一个
<p>
的第一个孩子是一个i
有文本OBAMA
的孩子,所有的孩子都是p
兄弟姐妹,直到你找到下一个p
的第一个孩子是一个i
没有文本Obama
??这是我到目前为止所做的尝试,但它只抓住了第一个
p
忽略了兄弟姐妹input = '''<span class="displaytext">
<p>
<i>OBAMA</i>Obama's first quotes
</p>
<p>More quotes from Obama</p>
<p>Some more Obama quotes</p>
<p>
<i>Moderator</i>Moderator's quotes
</p>
<p>Some more quotes</p>
<p>
<i>ROMNEY</i>Romney's quotes
</p>
<p>More quotes from Romney</p>
<p>Some more Romney quotes</p>
</span>'''
soup = BeautifulSoup(input)
debate_text = soup.find("span", { "class" : "displaytext" })
president_quotes = debate_text.find_all("i", text="OBAMA")
for i in president_quotes:
siblings = i.next_siblings
for sibling in siblings:
print(sibling)
只打印
Obama's first quotes
最佳答案
我认为一种类似于“a a”的解决方案会在这里起作用。这样地:
soup = BeautifulSoup(input, 'lxml')
debate_text = soup.find("span", { "class" : "displaytext" })
obama_is_on = False
obama_tags = []
for p in debate_text("p"):
if p.i and 'OBAMA' in p.i:
# assuming <i> is used only to indicate speaker
obama_is_on = True
if p.i and 'OBAMA' not in p.i:
obama_is_on = False
continue
if obama_is_on:
obama_tags.append(p)
print(obama_tags)
[<p>
<i>OBAMA</i>Obama's first quotes
</p>, <p>More quotes from Obama</p>, <p>Some more Obama quotes</p>]
关于python - 如何使用BeautifulSoup根据其子级和同级来选择标签?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40961029/