我正在尝试从网站抓取文字,同时保留其<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>
以及其他可能有标签的地方,有没有什么方法可以专门编程?
答案 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/>