如何抓取无特定类名HTML标签的网站?二手车站li内容提取求助
如何提取二手车网站中嵌套在li标签内的复杂信息
我正在爬取二手车网站https://jammer.ie/used-cars,已经成功获取车辆品牌(make)、型号(model)、年份(year)及里程(miles)信息,但其余信息都嵌套在li标签中,部分li标签内还包含img和span标签,不知道怎么提取这些内容。以下是我的Python代码:
from bs4 import BeautifulSoup import requests import pandas as pd url = 'https://jammer.ie/used-cars' response = requests.get(url) # 确认请求成功,状态码应为200 print(response.status_code) soup = BeautifulSoup(response.content, 'html.parser') # 获取所有车辆的右侧内容区域 results = soup.find_all('div', {'class': 'span-9 right-col'}) print(f"共找到{len(results)}辆二手车") # 提取第一辆车的基础信息 make = results[0].find('h6',{'class':'car-make'}).get_text(strip=True) model = results[0].find('p', {'class':'model'}).get_text(strip=True) year = results[0].find('p', {'class': 'year'}).get_text(strip=True) # 里程是第一个li的内容,用strip()去掉换行和空格 miles = results[0].find('li').get_text(strip=True) print(f"品牌:{make},型号:{model},年份:{year},里程:{miles}")
提取嵌套li中复杂内容的方法
那些包含img和span的li标签,本质是用图标(img)标注属性类型,用span显示属性值。我们可以遍历单辆车的所有li标签,逐个提取信息:
- 先获取单辆车的所有li标签,用
find_all('li')拿到该车辆的所有属性项 - 遍历每个li:如果有img,优先取img的
alt属性(这是属性名称,比如“Fuel Type”);再取span的文本(这是属性值,比如“Diesel”);要是没有span,直接取li的文本内容即可
修改后的完整代码(带注释)
from bs4 import BeautifulSoup import requests import pandas as pd url = 'https://jammer.ie/used-cars' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') results = soup.find_all('div', {'class': 'span-9 right-col'}) # 用来存储所有车辆信息的列表 cars_data = [] for car in results: # 提取基础信息 car_info = { '品牌': car.find('h6',{'class':'car-make'}).get_text(strip=True), '型号': car.find('p', {'class':'model'}).get_text(strip=True), '年份': car.find('p', {'class': 'year'}).get_text(strip=True), '里程': car.find('li').get_text(strip=True) } # 获取该车辆的所有属性li标签,跳过第一个已提取的里程li feature_list = car.find_all('li')[1:] for feature in feature_list: # 提取img的alt作为属性名(如果有),无则用默认值 img_tag = feature.find('img') attr_name = img_tag.get('alt', '未知属性').strip() if img_tag else '未知属性' # 提取span的文本作为属性值(如果有),无则直接取li文本 span_tag = feature.find('span') attr_value = span_tag.get_text(strip=True) if span_tag else feature.get_text(strip=True) # 将属性添加到字典中 car_info[attr_name] = attr_value cars_data.append(car_info) # 转成DataFrame方便查看和后续处理 df = pd.DataFrame(cars_data) print(df.head())
关键代码解释
get_text(strip=True):比replace('\n', "")更高效,直接去掉文本前后的空格、换行符car.find_all('li')[1:]:跳过第一个已提取的里程li,避免重复处理img_tag.get('alt', '未知属性'):设置默认值,避免因img无alt属性导致报错- 用字典存储单辆车的所有信息,最后汇总成列表转DataFrame,便于数据整理
内容的提问来源于stack exchange,提问作者user14820169
相关产品推荐
相关产品推荐

