首页 > 解决方案 > 使用 BeautifulSoup 返回被双标签包围的文本

问题描述

我正在使用 url 遍历列表。在每一页上都有 1 到 n 个描述,它们被双 p 标签包围。

BeautifulSoup.find(class_='view-content')

# url 1
<div class="view-content">
<div class="row">
<div class="description">
<p><p>One animal</p>
</p>
</div>
</div>
</div>

# url 2
<div class="view-content">
<div class="row">
<div class="description">
<p><p>One person</p>
</p>
</div>
</div>
<div class="row">
<div class="description">
<p><p>Two people </p>
</p>
</div>
</div>
</div>

当我使用

for d in soup.find(class_='view-content').find_all('p'):
    dd = d.contents[0]
    print(dd)

我明白了

<p>One animal</p>One animal
<p>One person</p>One person
<p>Two people</p>Two people

而不是预期

One animal
One person
Two people

有什么方法可以检索被双 p 标签包围的内容?

编辑:以下返回相同,但至少没有 p 标签。

for d in soup.find_all("div",class_="view-content"):
    print(' '.join(i.text for i in review.find_all('p')[1:]))

标签: pythonhtmlbeautifulsouptags

解决方案


另一种解决方案。

from simplified_scrapy import SimplifiedDoc
html = '''
# url 1
<div class="view-content">
<div class="row">
<div class="description">
<p><p>One animal</p>
</p>
</div>
</div>
</div>

# url 2
<div class="view-content">
<div class="row">
<div class="description">
<p><p>One person</p>
</p>
</div>
</div>
<div class="row">
<div class="description">
<p><p>Two people </p>
</p>
</div>
</div>
</div>
'''
doc = SimplifiedDoc(html)
divs = doc.selects('div.view-content')
datas=[]
for div in divs:
  datas.extend ([p.text for p in div.ps])
print (datas)

结果:

['One animal', 'One person', 'Two people']

推荐阅读