【问题标题】:beautifulsoup - Fetching text either side of a br tagbeautifulsoup - 获取 br 标签两侧的文本
【发布时间】:2017-12-16 16:47:01
【问题描述】:

不幸的是,我遇到了以下问题:

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

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

【问题讨论】:

  • 你在这里使用什么解析器(lxml?html.parser?)
  • html.parser 是我一直在使用的

标签: python beautifulsoup


【解决方案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"'

【讨论】:

  • 非常感谢您的帮助,我也试试这个。
【解决方案2】:

找到br标签后,您可以使用.previousSibiling.nextSibling属性:

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

【讨论】:

    【解决方案3】:

    您可以通过多种方式做到这一点。这是另一种方式:

    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"']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2021-10-05
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多