【问题标题】:How to only select the nth (42nd) `p` tag with BeautifulSoup?如何使用 BeautifulSoup 只选择第 n 个(第 42 个)`p` 标签?
【发布时间】:2021-03-11 20:32:01
【问题描述】:

我编写了一个程序,将页面源代码从https://www.coinbase.com/price 保存到pyt.txt。如何从这个文本文件中解析比特币的价格并打印出来?

到目前为止,我了解到页面源中的第 42 个p 标签是保存比特币价格的标签。因此,我尝试提取该值并打印它的代码如下:

import bs4
file = open('location/pyt.txt', 'r')

soup = bs4.BeautifulSoup(file, 'lxml')
for btc in soup.find_all('p'):
    print(btc[41])

file.close()

当我运行它时,我得到了错误:

return self.attrs[key]
KeyError: 41

经过几个小时的 YouTubing 和谷歌搜索后,BeautifulSoup 似乎效果最好,但我似乎无法弄清楚。

【问题讨论】:

标签: python python-3.x beautifulsoup keyerror


【解决方案1】:

您可以使用 CSS 选择器 p:nth-of-type(42),它将选择第 42 个 <p> 标记。

print(soup.select_one('p:nth-of-type(42)'))

【讨论】:

  • 我将“for btc in soup.find_all('p'): print(btc[41])”替换为“print(soup.select_one('p:nth-of-type(42)) '))”,它返回“无”。您是否知道可能是什么问题,因为我没有收到任何错误,所以它似乎正在“工作”。
  • @testical 请使用 HTML 编辑您的问题。
【解决方案2】:

btc 不是列表或任何其他数据类型,它是字符串 因此,如果您想以这种方式访问​​第 41 个 p 标签,您可以将每个项目附加到列表中,然后访问列表的索引

【讨论】:

  • 我假设 ('p') 会将所有 p 标签分配给“btc”并创建一个列表。你知道我应该如何创建这样的列表吗?