【问题标题】:Separating by <br> tags in get_text()在 get_text() 中用 <br> 标签分隔
【发布时间】:2018-04-04 10:48:46
【问题描述】:

我正在尝试从网站上抓取文本,同时保留其&lt;br&gt; 标签,以便使用'\n's 格式化我的输出。但是,我找不到一种有效的方法来做到这一点。 (注意:我不能使用get_text(separator='\n'),因为&lt;a&gt; 之类的标签会将其分成尴尬的间距。)

我可能会尝试抓取的示例文本如下所示:

<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()

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

除了围绕&lt;div&gt;&lt;a&gt; 以及其他可能有标签的东西之外,还有什么方法可以解决吗?

【问题讨论】:

  • 使用.text 保留文本中的换行符和空格。你试过吗?或者,这不是您想要的吗?
  • @KeyurPotdar 是的,这不是我想要的,因为它忽略了我想用换行符替换的 br 标签。

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


【解决方案1】:

您可以创建一个递归函数,该函数将返回包括&lt;br&gt; 标签在内的所有文本。

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/>

【讨论】:

  • 是的,我知道这一点。我很欣赏这个建议,但这仍然给我留下了我必须过滤掉的所有其他东西(比如 标签,同时仍然保留它们的文本),我说我试图避免这种情况,只得到文本br 有效地标记。
  • 查看更改后的解决方案。这是你想要的吗?
  • 我完全忽略了您在示例 HTML 中的 &lt;a&gt; 标记,因此是天真的第一个解决方案 :)
  • 我明白你想要什么,但是,没有新的库导入(因此没有额外费用)。此外,就时间效率而言,这是您将获得的最快解决方案(至少我能想到)。但是,是的,这不是像 get_text() 这样简单的解决方案。
  • 嗯.. 很公平。我会继续寻找,如果我找不到任何东西,那么我会标记你的最佳答案。再次感谢您的帮助!
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多