在get_text()中用<br/>标签分隔

时间:2018-04-04 10:48:47

标签: python python-3.x web-scraping beautifulsoup

我正在尝试从网站抓取文字,同时保留其<br>标记,以便使用'\n'格式化我的输出。但是,我找不到一种有效的方法。 (注意:我无法使用get_text(separator='\n'),因为像<a>标签之类的内容会将其分解为笨拙的间距。)

我可能试图抓取的示例文本将显示为:

<div class="example">
  Lorem ipsum dolor sit amet?
  <br>
  consectetur adipiscing elit.
  <br>
  Vivamus nec <a class="someLink" href="example.com">arcu</a> 
  erat.
  <br>
  Suspendisse a mauris vestibulum, rhoncus.
  <br>
</div>

我知道我可能只有一些代码:

def get_stuff(message):
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), 'html.parser')
    example = soup.find("div", class_="example").get_text()

它会让文字很好。但同样,我希望能够使用<br>标记对其进行格式化。我认为soup.find("div", class_="example").get_text(separator="br")可以解决问题,但似乎没有办法在<br>中使用get_text()作为分隔符。

<div><a>以及其他可能有标签的地方,有没有什么方法可以专门编程?

1 个答案:

答案 0 :(得分:2)

您可以创建一个递归函数,该函数将返回包含<br>标记的所有文本。

from bs4 import BeautifulSoup, Tag

def get_text_with_br(tag, result=''):
    for x in tag.contents:
        if isinstance(x, Tag):  # check if content is a tag
            if x.name == 'br':  # if tag is <br> append it as string
                result += str(x)
            else:  # for any other tag, recurse
                result = get_text_with_br(x, result)
        else:  # if content is NavigableString (string), append
            result += x

    return result

html = '''
<div class="example">
  Lorem ipsum dolor sit amet?
  <br>
  <a>  text inside a_tag</a>
  consectetur adipiscing elit.
  <br>
  Vivamus nec <a class="someLink" href="example.com">arcu</a> 
  erat.
  <br>
  Suspendisse a mauris vestibulum, rhoncus.
  <br>
</div>'''

soup = BeautifulSoup(html, 'html.parser')
text = get_text_with_br(soup.find('div'))
print(text)

输出:

  Lorem ipsum dolor sit amet?
  <br/>
  text inside a_tag
  consectetur adipiscing elit.
  <br/>
  Vivamus nec arcu 
  erat.
  <br/>
  Suspendisse a mauris vestibulum, rhoncus.
  <br/>