Python:告诉BeautifulSoup从两个中选择一个值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:告诉BeautifulSoup从两个中选择一个值相关的知识,希望对你有一定的参考价值。

我正在使用BeautifulSoup抓取一个值,但输出给了我两个值,因为它在页面上是两次,我该如何选择其中一个?这是我的代码:

url = 'URL'
r = requests.get(url,headers=headers)
soup = BeautifulSoup(r.content, "html.parser")
data = soup.find_all("input", {'name': 'CsrfToken', 'type':'hidden'})

for data in data:
    print(data.get('value'))

Output: 
c8b3226dc829256687cac584a9421e8acc4649ff4ee5f8f386ea11ce03a811c8
c8b3226dc829256687cac584a9421e8acc4649ff4ee5f8f386ea11ce03a811c8

The first 'CsrfToken' is in: 
<form method="post" data-url="url" id="test-form" data-test-form="" action="url" name="test-form"><input type="hidden" name="CSRFToken" value="c8b3226dc829256687cac584a9421e8acc4649ff4ee5f8f386ea11ce03a811c8">

The second 'CsrfToken' is in:
<form method="post" name="AnotherForm" class="th-form th-form__compact th-form__compact__inline" data-testid="th-comp-Another-form" action="url" id="AnotherForm"><input type="hidden" name="CSRFToken" value="c8b3226dc829256687cac584a9421e8acc4649ff4ee5f8f386ea11ce03a811c8">

我只想要第一个或第二个值,以便我的负载请求可以正确加载。

答案

使用find(),它将为您提供页面上标记的第一个实例。 find_all()返回页面上标签的所有实例。

来自documentation关于find_all()find()

find_all()方法扫描整个文档以查找结果,但有时您只想找到一个结果。如果您知道文档只有一个<body>标记,那么扫描整个文档寻找更多内容是浪费时间。每次调用limit=1时,你都可以使用find_all方法,而不是传入find()

所以你仍然可以使用find_all(),只需传入1作为限制参数。

另一答案

要尽早离开循环,请尝试:

for data in data:
    print(data.get('value'))
    break

要始终获得您可以执行的第一个元素:

def get_first_value(item):
    try:
        return item.get('value')[0]
    except TypeError:
        return None

value = get_first_value(data)

以上是关于Python:告诉BeautifulSoup从两个中选择一个值的主要内容,如果未能解决你的问题,请参考以下文章

关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup

在 Python 中使用 BeautifulSoup 从脚本标签中提取文本

Python:BeautifulSoup - 从类名中获取属性值

Python/BeautifulSoup - 如何从元素中删除所有标签?

当默认目录为python2.7时,如何将beautifulsoup安装到python3中?

使用 urllib 和 BeautifulSoup 通过 Python 从 Web 检索信息