【问题标题】:Accesing a second tag with beatifoulsoup使用 beautifulsoup 访问第二个标签
【发布时间】:2020-01-11 12:58:59
【问题描述】:

我开始从事一些网站抓取项目,但偶然发现在同一父标签中选择第二个标签时遇到了一些困难。我试过用谷歌,但我还是不能清楚地理解它。

我的代码如下所示:

url = 'url to site'
content = requests.get(url).text
soup = BeautifulSoup(content, 'lxml')

car_add = soup.find('div', class_='offer-wrapper')

ad_title = car_add.find('h3', class_='lheight22 margintop5').a.strong.text
ad_price = car_add.find('p', class_='price').text
ad_location = car_add.find('td', class_='bottom-cell').div.p.small.span.text
ad_time_and_location = car_add.find('td', class_='bottom-cell').div.p
print(ad_time_and_location.prettify())

这会打印出以下内容:

<p class="lheight16">
 <small class="breadcrumb x-normal">
  <span>
   <i data-icon="location-filled">
   </i>
   Otopeni
  </span>
 </small>
 <small class="breadcrumb x-normal">
  <span>
   <i data-icon="clock">
   </i>
    09:25
  </span>
 </small>
</p>

我想要做的是访问字符串'09:25'但是当我输入时:

ad_location = car_add.find('td', class_='bottom-cell').div.p.small.span.text

然后它会自动默认为第一个文本标签。

我尝试过使用 select() 方法,但它给了我一个空列表。谁能帮我解决这个问题?

谢谢!

【问题讨论】:

  • 请提供一个 MCVE 示例。由于我们没有您输入的所有 HTML,请跳过请求代码,只需向我们提供重现此代码所需的 HTML sn-p。
  • 您可以使用find_all('span') 获取所有span 的列表,然后使用[1] 从列表中获取第二个元素。
  • lxml .xpath 语法更好,你可以在表达式中直接有下标[1]
  • @smci,谢谢你的提示。我对网络抓取真的很陌生,我刚刚学习这些解析器。再次感谢!

标签: python


【解决方案1】:

您可以使用find_all('span') 获取所有span 的列表,然后使用[1] 从列表中获取第二个元素。

from bs4 import BeautifulSoup as BS

text = '''<p class="lheight16">
 <small class="breadcrumb x-normal">
  <span>
   <i data-icon="location-filled">
   </i>
   Otopeni
  </span>
 </small>
 <small class="breadcrumb x-normal">
  <span>
   <i data-icon="clock">
   </i>
    09:25
  </span>
 </small>
</p>'''

soup = BS(text, 'html.parser')

item = soup.find('p').find_all('span')[1].get_text(strip=True)

print(item)

【讨论】:

  • 非常感谢!结果真的很好。祝你有美好的一天:)
  • @GhirasimDaniel 您可以将答案标记为已接受。当你有足够的声誉时,你可以投票。
  • 我刚刚标记了它,昨天忘记了。感谢您的提醒 ! :)