beautifulsoup - 在br标签的任一侧获取文本

时间:2017-12-16 16:47:01

标签: python beautifulsoup

遗憾的是我遇到了以下问题:

 <a href="someurl"> 
"TEXT ONE"
 <br>
 "TEXT TWO"
 </a>

我需要单独的文本一和文本二。 我只能通过使用"TEXT ONE TEXT TWO"来提供"text = container.a.text"作为整体来获取它们,而容器是a标签的父级。我尝试过尽可能多的方法但没有成功。我无法正确使用br代码。
谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

我会避免依赖br元素的存在,而是找到a 中的所有文本节点:

In [1]: from bs4 import BeautifulSoup

In [2]: html = """ <a href="someurl"> 
    ...: "TEXT ONE"
    ...:  <br>
    ...:  "TEXT TWO"
    ...:  </a>"""

In [3]: soup = BeautifulSoup(html, "html.parser")

In [4]: [item.strip() for item in soup.a(text=True)]
Out[4]: ['"TEXT ONE"', '"TEXT TWO"']

请注意,a(text=True)a.find_all(text=True)的简短版本。

当然,您可以将其解压缩为单独的变量(如果需要)

In [5]: text_one, text_two = [item.strip() for item in soup.a(text=True)]

In [6]: text_one
Out[6]: '"TEXT ONE"'

In [7]: text_two
Out[7]: '"TEXT TWO"'

答案 1 :(得分:0)

找到.previousSibiling代码后,您可以使用.nextSiblingbr属性:

>>> container.a.find("br").previousSibling
' \n"TEXT ONE"\n '
>>> container.a.find("br").nextSibling
'\n "TEXT TWO"\n '

答案 2 :(得分:0)

您可以通过多种方式执行相同的操作。这是另一种方式:

from bs4 import BeautifulSoup

content='''
 <a href="someurl"> 
"TEXT ONE"
 <br>
 "TEXT TWO"
 </a>
'''
soup = BeautifulSoup(content,'lxml')
for items in soup.select('a'):
    elem = [' '.join(item.split()) for item in items.strings]
    print(elem)

输出:

['"TEXT ONE"', '"TEXT TWO"']