Python 使用具有相同div的BeautifulSoup进行Web解析-不能返回';不适用';如果未在第页找到

Python 使用具有相同div的BeautifulSoup进行Web解析-不能返回';不适用';如果未在第页找到,python,parsing,web-scraping,beautifulsoup,Python,Parsing,Web Scraping,Beautifulsoup,因此,我试图刮这整个网站,但问题是,该网页使用相同的条目,我想要的。因此,这就是为什么我要为同样的内容执行findAll,然后使用if:语句查找各个参数 我目前的问题是,我无法使所有参数的长度相同,因为有些页面没有该参数。这也意味着,如果列的长度不同,我无法将其导出到csv 此外,对于当前代码,如果未找到,则不会返回“N/A” 这是我的代码(可能也不是最有效的) ''结构: {'Bedrooms' : Listing.text} if Listing.text else 'N/A' 如果Lis

因此,我试图刮这整个网站,但问题是,该网页使用相同的条目,我想要的。因此,这就是为什么我要为同样的内容执行findAll,然后使用if:语句查找各个参数

我目前的问题是,我无法使所有参数的长度相同,因为有些页面没有该参数。这也意味着,如果列的长度不同,我无法将其导出到csv

此外,对于当前代码,如果未找到,则不会返回“N/A”

这是我的代码(可能也不是最有效的)

''

结构:

{'Bedrooms' : Listing.text} if Listing.text else 'N/A'
如果
Listing.text
None
或如果
Listing.text
为空字符串,则将获取值
'N/A'
。上一个
如果
,则禁用此可能性

if 'Bedrooms:' in Listing.text:
        bedrooms.append({'Bedrooms' : Listing.text} if Listing.text else 'N/A')
如果在
之后输入块,则
列表。文本
不为空

也许你的意思是:

bedrooms.append({'Bedrooms' : Listing.text} if 'Bedrooms:' in Listing.text else 'N/A')
这仍然不是最优的,但它是对代码的最小修正

更新#1

在新示例中,所有项都列在一个字符串中,不带分隔符。在这种情况下,您应该首先提取值。例如,使用正则表达式

import re

l_text = 'ID: 225671 Type: Apartment Size: 300 m²  Bedrooms: 3  Bathrooms: 3  '

pat_id = r'ID:\s*(\d+)'
pat_bedrooms = r'Bedrooms:\s*(\d+)'
pat_apt_size = r'Apartment Size:\s*(\d+)\s*m²'
pat_id2 = r'ID2:\s*(\d+)'

res = re.search(pat_id, l_text)
val_id = res.group(1) if res else 'N/A'

res = re.search(pat_id2, l_text)
val_id2 = res.group(1) if res else 'N/A'

res = re.search(pat_bedrooms, l_text)
val_bedrooms = res.group(1) if res else 'N/A'

res = re.search(pat_apt_size, l_text)
val_apt_size = res.group(1) if res else 'N/A'


print(val_id, val_id2, val_bedrooms, val_apt_size)
输出:

225671 N/A 3 300
225671 N/A 3 300
225671 N/A 3 300 m²
或者您可以使用通用模式:

pat_any = r'([A-Z][^:]*):\s*(\d+)'
res = re.findall(pat_any, l_text)
res = {k:v for k,v in res}

val_id = res.get('ID', 'N/A')
val_id2 = res.get('ID2', 'N/A')
val_bedrooms = res.get('Bedrooms', 'N/A')
val_apt_size = res.get('Apartment Size', 'N/A')

print(val_id, val_id2, val_bedrooms, val_apt_size)
输出:

225671 N/A 3 300
225671 N/A 3 300
225671 N/A 3 300 m²
此实现降低了
。如果您希望将其包括在内,您可以使用:

pat_any = r'([A-Z][^:]*):\s*([^A-Z]+)'
res = re.findall(pat_any, l_text)
res = {k:v.strip() for k,v in res}

val_id = res.get('ID', 'N/A')
val_id2 = res.get('ID2', 'N/A')
val_bedrooms = res.get('Bedrooms', 'N/A')
val_apt_size = res.get('Apartment Size', 'N/A')

print(val_id, val_id2, val_bedrooms, val_apt_size)
输出:

225671 N/A 3 300
225671 N/A 3 300
225671 N/A 3 300 m²

实现取决于您未显示的详细信息。

另外,为什么要使用
'N/A'
而不是无?变量和函数名应该遵循带有下划线的
小写形式。是的,这里是新手!但是,也谢谢。谢谢,但这并不完全是我想要做的。下面是列表的一个示例。文本:
ID:225671类型:公寓面积:300平方米卧室:3个卫生间:3个停车位:1个卫星电视花园健身房游泳池阳台允许养宠物
,但有时这些条目不全可用,我想通过向获取相同长度的所有字符串。很抱歉,答复太晚@Sergey@aalnaser你可以隐藏更多的细节,但不是全部。