使用BeautifulSoup解析电影成绩单-如何忽略文本中嵌套的标记?

使用BeautifulSoup解析电影成绩单-如何忽略文本中嵌套的标记?,beautifulsoup,Beautifulsoup,我正在使用BeautifulSoup解析一个电影成绩单,如下所示: <b>A</b>: Look! <br/> <b>B</b>: (<i>whispers</i>) Shhh. Be quiet. <br/> <b>A</b>: (<i>lowering voice</i>) Sorry. <br/> 我想把I标签中的字符方向与对话文本的

我正在使用BeautifulSoup解析一个电影成绩单,如下所示:

<b>A</b>: Look!
<br/>
<b>B</b>: (<i>whispers</i>) Shhh. Be quiet.
<br/>
<b>A</b>: (<i>lowering voice</i>) Sorry.
<br/>
我想把I标签中的字符方向与对话文本的其余部分一起拉出来。如何编辑代码,使结果为[':Look!',':(低声)对不起]

编辑:谢谢你的帮助!您的所有答案都适用于提供的HTML片段,但我最终编写了自己的代码,可以更好地解析整个文本:

A_entire_dialogue = []

for i in soup.find_all('b', string='A'):
    for sib in i.next_siblings:
        if sib.name == None: 
            A_entire_dialogue.append(sib)
        elif sib.name == 'i':
            A_entire_dialogue.append(sib.get_text())
        elif sib.name == 'br':
            break
        else:
            print("Note: new tag not previously encountered.")
            break
请检查这个

from bs4 import BeautifulSoup

page = """
<b>A</b>: Look!
<br/>
<b>B</b>: (<i>whispers</i>) Shhh. Be quiet.
<br/>
<b>A</b>: (<i>lowering voice</i>) Sorry.
<br/>
"""


soup = BeautifulSoup(page, 'html.parser')

A_entire_dialogue = []

for text in soup.text.split("\n"):
    if text and text.startswith("A"):
        A_entire_dialogue.append(text[1:])

print(A_entire_dialogue)
另一个解决方案

from simplified_scrapy import SimplifiedDoc
html = '''
<b>A</b>: Look!
<br/>
<b>B</b>: (<i>whispers</i>) Shhh. Be quiet.
<br/>
<b>A</b>: (<i>lowering voice</i>) Sorry.
<br/>
'''
doc = SimplifiedDoc(html)
A_lines = doc.getElementsByReg("A",tag="b").nextText(end="<br />")
print (A_lines)

我不知道BeautifulSoup,但是你不应该一直拉兄弟姐妹直到到达
元素,而不是只拉第一个兄弟姐妹吗?尝试将此HTML绘制为一棵树。@JamesMcLeod谢谢!我对编码还不熟悉,没有意识到这是一种选择,但多亏了你的建议,我才明白这一点。
[': Look!', ': (lowering voice) Sorry.']
from simplified_scrapy import SimplifiedDoc
html = '''
<b>A</b>: Look!
<br/>
<b>B</b>: (<i>whispers</i>) Shhh. Be quiet.
<br/>
<b>A</b>: (<i>lowering voice</i>) Sorry.
<br/>
'''
doc = SimplifiedDoc(html)
A_lines = doc.getElementsByReg("A",tag="b").nextText(end="<br />")
print (A_lines)
[': Look!', ': (lowering voice) Sorry.']