所以我试图抓取整个网站,但问题是该页面与我想要的条目使用相同的条目。所以这就是为什么我要做 findAll 然后使用 if: 语句查找各个参数的原因。
我目前的问题是我无法让所有参数的长度相同,因为某些页面没有该参数。这也意味着如果列的长度不同,我无法将其导出为 csv。
此外,对于当前代码,当找不到时,它不会返回"N/A"。
这是我的代码(可能也不是最有效的(
'''
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
header = soup.find('p', attrs={'class':'ho1'}).text
location.append({'Location' : header.partition(split)[2]} if header else 'N/A')
for Listing in soup.findAll('div', attrs={'style' : "height:19px; line-height:19px; color:#333; display:inline; float:left"}):
print(Listing)
if 'ID: ' in Listing.text:
identification.append({'ID' : Listing.text} if Listing.text else 'N/A')
if 'Bedrooms:' in Listing.text:
bedrooms.append({'Bedrooms' : Listing.text} if Listing.text else 'N/A')
if 'Bathrooms: ' in Listing.text:
bathrooms.append({'Bathrooms' : Listing.text} if Listing.text else 'N/A')
if 'Type: ' in Listing.text:
typetotal.append({'Type' : Listing.text} if Listing.text else 'N/A')
'''
结构:
{'Bedrooms' : Listing.text} if Listing.text else 'N/A'
将获取值'N/A'
如果Listing.text
None
或Listing.text
为空字符串。这种可能性被以前的if
禁用。
if 'Bedrooms:' in Listing.text:
bedrooms.append({'Bedrooms' : Listing.text} if Listing.text else 'N/A')
如果我们在if
之后进入块,那么Listing.text
它不为空。
也许你的意思是:
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
或者您可以使用通用模式:
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
此实现会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 m²
实现取决于您未显示的详细信息。