【问题标题】:Find specific number of things with Beautiful soup用美丽的汤找到特定数量的东西
【发布时间】:2021-11-11 21:48:08
【问题描述】:

我知道find() 命令只找到第一个匹配项,而find_all() 找到所有匹配项。有没有办法找到一个特定的数字? 如果我只想找到前两次出现的情况,有没有一种方法可以解决这个问题,还是需要在循环中解决?

【问题讨论】:

  • 您可以使用列表切片。如果您只想要前两个,请使用soup.find_all(...)[:2]
  • 嗨@akira,我可以提醒您将以下解决方案之一标记为答案吗?

标签: python html web-scraping beautifulsoup


【解决方案1】:

您可以使用 CSS 选择器来了解您需要提取的子位置。假设您拥有的 HTML 是这样的:

<div id="id1">
   <span>val1</span>
   <span>val2</span>
   <span>val2</span>
</div>

然后您可以通过以下方式选择第一个元素:

child = div.select('span:nth-child(1)')

用你想要的数字替换 1

如果要选择多个匹配项,可以像这样连接子项:

child = div.select('span:nth-child(1)') + div.select('span:nth-child(2)')

得到前两个孩子

nth-child 选择器还可以获得奇数的出现次数:

child = div.select('span:nth-child(2n+1)')

n 从 0 开始:

n: 0 => 2n+1: 1
n: 1 => 2n+1: 3
..

在解决评论后编辑,谢谢!

【讨论】:

    【解决方案2】:

    如果你正在寻找前 n 个元素:

    正如 cmets 中所指出的,您可以使用 find_all 查找所有元素,然后使用列表切片选择所需数量的元素。

    soup.find_all(...)[:n]  # get first n elements
    

    或者更高效,你可以使用find_alllimit参数来限制你想要的元素数量。

    soup.find_all(..., limit = n)
    

    这样更有效,因为它不会遍历整个页面。达到限制后停止执行。

    请参阅documentation 了解更多信息。

    如果您正在寻找第 n(th) 个元素:

    在这种情况下,您可以使用 css 选择器的 :nth-child 属性:

    soup.select_one('span:nth-child(n)')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 2020-03-15
      • 1970-01-01
      • 2016-12-18
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多