使用Python和Beautiful Soup如何捕获空标签

时间:2018-08-30 21:34:34

标签: python web-scraping beautifulsoup

我正在尝试将网络数据读入列表。问题是我需要考虑的数据中有空白点。

例如,对于下面的数据,我希望最终输出为类似以下的列表:

德克萨斯州普莱诺
纽约,纽约
科罗拉多州丹佛
NA
伊利诺伊州芝加哥
加利福尼亚旧金山

<span itemprop="addressLocality">Plano, TX</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">Denver, CO</span>
<span itemprop="addressLocality"></span>
<span itemprop="addressLocality">Chicago, IL</span>
<span itemprop="addressLocality">San Francisco, CA</span>

目前,我正在尝试打印结果以进行验证,然后再将其添加到列表中,我的代码如下:

for span in div.find('span', {'itemprop':'addressLocality'}):
    if span:
        print(span)
    else:
        print('NA')

此代码为我提供了以下输出,该输出未说明空标记:

德克萨斯州普莱诺
纽约,纽约
科罗拉多州丹佛
伊利诺伊州芝加哥
加利福尼亚州旧金山

我刚刚开始学习Python和Beautiful Soup。
我尝试过if..else的变体;尝试:...除了:和.contents。我敢肯定这很简单。
任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

您应该使用find_all,它返回找到的标签的所有实例。 find仅返回找到的第一个。

if span:将得出True。您想使用get_text获取包含的文本,并检查其是否为非空。

尝试一下:

cities = []

for span in div.findAll('span', {'itemprop': 'addressLocality'}):
    text = span.get_text()
    if len(span) > 0:
        cities.append(text)

print(cities)

答案 1 :(得分:0)

尝试使用find_all,如果没有文字,请用“ N / A”填充

spans = div.find_all('span', {'itemprop':'addressLocality'})
cities = [span.get_text() if span.get_text() else "N/A" for span in spans]
print cities

如果您想坚持使用原始代码结构,则非常接近,但是请尝试以下方法:

for span in div.find_all('span', {'itemprop':'addressLocality'}):
    if span.get_text():
        print(span.get_text())
    else:
        print('NA')