首页 > 解决方案 > 从页面中抓取特定的重复元素

问题描述

我在刮这个时遇到了一些问题:

<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa">

在这个字符串之前,我发现已经有 4 个相同但具有不同标记值的字符串,我如何使用 beautifulsoup 刮掉 6 个中的第 5 个?

不幸的是,由于我正在从事私人项目,因此我无法提供代码或网站的示例,在将我的问题标记为不完整之前,请提出一些问题,ty!

标签: pythonhtmlbeautifulsoup

解决方案


您可以通过<input>两种方式获取第 5 个标签。

  • 使用select_one()- 选择第 5 个<input>标签

    x = soup.select_one('input:nth-of-type(5)')
    
  • 通过find_all()属性使用name- 返回匹配<input>标签的列表。

    y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
    

如果<input>整个 HTML 中只有这 6 个标签,则使用select_one().

如果您有<input>这 6 个以外的其他标签,那么您必须专门选择您需要的输入标签 - 因此您必须使用属性过滤输入标签name = __RequestVerificationToken使用find_all().

此代码将使用select_one()和打印第 5 个输入标签的值find_all()

from bs4 import BeautifulSoup
s = '''
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa1">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa2">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa3">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa4">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa6">
'''


soup = BeautifulSoup(s, 'lxml')
# Using select_one()
x = soup.select_one('input:nth-of-type(5)')
print(x)
print(x['value'])

# Using find_all()
y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
print(y)
print(y['value'])
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5

<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5

推荐阅读