如何检查美丽的汤对象是否包含数字

时间:2018-03-10 18:07:23

标签: python beautifulsoup

我试图刮一页,我有问题检查一个beautifulsoup元素是否包含数字。我想清理字符串,如果它包含数字。在这种情况下,我只想保留数字,这是一个邮政编码。但在我清理它之前,我必须检查,如果该元素甚至有一个邮政编码。

我使用以下代码搜索元素:

soup.find("span",{"class": "locality"}).get_text()
Output: 68549 Ilvesheim, Baden-Württemberg, 

我尝试使用以下代码检查字符串,但它总是说" False"

soup.find("span",{"class": "locality"}).get_text()).isalnum()
soup.find("span",{"class": "locality"}).get_text()).isdigit()

还有另一种检查方法吗?因为它包含" 68549"应该说是TRUE

3 个答案:

答案 0 :(得分:2)

您可以使用this simple function检查字符串是否包含数字:

def hasNumbers(inputString):
    return any(char.isdigit() for char in inputString)

但我认为这是一个XY问题,你真正想要的是提取邮政编码的正则表达式,请查看以下内容:

\s(\d+)\s(您可能需要根据邮政编码的可接受形式进行更改)

>>> s = 'Output: 68549 Ilvesheim, Baden-Württemberg,'
>>> re.findall(r'\s(\d+)\s', s)
['68549']

如果字符串不包含邮政编码,您可以通过确保结果re.findall()的长度为0来检查:

>>> re.findall(r'\s(\d+)\s', 'No zip code here!')
[]

答案 1 :(得分:0)

使用正则表达式:

import re
hasnumber = re.findall(r'\d+', "68549 Ilvesheim, Baden-Württemberg")
if hasnumber:
    print(hasnumber)

<强>输出:

['68549']

答案 2 :(得分:0)

如果您要查找邮政编码,可能需要考虑有效范围。例如德国邮政编码的长度恰好是5位数:

import re

for test in ['68549 Ilvesheim, Baden-Württemberg', 'test 01234', 'test 2 123456789', 'inside (56089)']:
    if len(re.findall(r'\b\d{5}\b', test)):
        print "'{}' has zipcode".format(test)

因此,对于这三个示例,第三个测试与邮政编码不匹配:

'68549 Ilvesheim, Baden-Württemberg' has zipcode
'test 01234' has zipcode
'inside (56089)' has zipcode

{5}告诉正则表达式与\b正好匹配5位数,确保任意一侧的单词边界。如果您想要五个或大小的数字,请使用{5,6}