我想从 BeautifulSoup 对象创建一个数据框 -
import pandas as pd
from requests import get
from bs4 import BeautifulSoup
import re
# Fetch the web page
url = 'https://carbondale.craigslist.org/search/apa#search=1~gallery~0~0'
response = get(url) # link exlcudes posts with no picures
page = response.text
# Parse the HTML content
soup = BeautifulSoup(page, 'html.parser')
# Information I need
list_url = []
title = []
location = []
price = []
# I run the following
list_url = [a['href'] for a in soup.select('a[href^="https"]')]
title = [x.text for x in soup.find_all(class_="title")]
location = [x.text for x in soup.find_all(class_="location")]
price = [x.text for x in soup.find_all(class_="price")]
但我面临的问题是,对于某些类别(例如,标题或位置),缺少一些元素,因此,当我尝试创建数据框时,它会显示错误,因为None
值不相等,因为所有列表的大小都不相等。您可以使用该len()
函数检查列表的大小。实际上,我想在数据框的列中包含“无”一词来表示缺失的元素。
您需要遍历页面中的每个列表,并逐一将值添加到
list_url
、list_location
和list_title
。list_price
如果其中任何一个值缺失,则将 None 添加到相应的列表中。然后,您可以使用列表创建 DataFrame。要迭代列表,我必须查看行的结构,并注意到
li class="cl-static-search-result"
使用了。然后,您可以迭代此列表以找到所需的值,而不是find_all
在整个页面上使用,因为这样做不会考虑列表中项目之间的关系。尝试一下:
打印出前 5 行
对于任何列表,如果值不可用或我们找不到它,我们会附加 None。缺少值的数据框将如下所示: