如何用BeautifulSoup提取嵌套网页数据?现有代码问题求助
网页汽车信息提取问题解决
待处理网页源码
</li> <li class="cl-static-search-result" title="BELLO HONDA ACCORD "95 MIL MILLAS". REALMENTE COMO NUEVO"> <a href="link1"> <div class="title">BELLO HONDA ACCORD "95 MIL MILLAS". REALMENTE COMO NUEVO</div> <div class="details"> <div class="price">$4,600</div> <div class="location"> Miami </div> </div> </a> </li> <li class="cl-static-search-result" title="Honda Element"> <a href=" link2 "> <div class="title">Honda Element</div> <div class="details"> <div class="price">$4,950</div> <div class="location"> Coral springs </div> </div> </a> </li> <li class="cl-static-search-result" title="Mint Jeep"> <a href=" link3 "> <div class="title">Mint Jeep</div> <div class="details"> <div class="price">$8,500</div> <div class="location"> Pompano </div> </div> </a> </li>
目标提取格式
| URL | TITLE | PRICE | | ----- | ------------------------------------------- | ------ | | link1 | BELLO HONDA ACCORD "95 MIL MILLAS". REALMENTE COMO NUEVO | $4,600 | | link2 | Honda Element | $4,950 | | link3 | Mint Jeep | $8,500 |
现有代码问题
你的代码在遍历每个<a>标签时,又全局遍历所有.title的div,导致每个URL对应所有标题,无法实现一一对应。同时CSV写入逻辑也有问题,每次循环都重新打开文件覆盖内容,且只写入URL。
修正后的代码
from urllib import request from bs4 import BeautifulSoup import csv page_url = 'URLNAME' rawpage = request.urlopen(page_url) soup = BeautifulSoup(rawpage, 'html5lib') results = [] # 遍历每个搜索结果的li标签,这是信息的最小独立单元 for li in soup.find_all('li', class_='cl-static-search-result'): try: # 提取当前li内的a标签href,去除前后空格 url = li.find('a').get('href').strip() # 提取当前li内的title文本 title = li.find('div', class_='title').text.strip() # 提取当前li内的price文本 price = li.find('div', class_='price').text.strip() # 将数据存入列表 results.append({'url': url, 'title': title, 'price': price}) except AttributeError: # 跳过缺失信息的条目 continue # 写入CSV文件 with open('links.csv', 'w', newline='', encoding='utf-8') as csv_out: csv_writer = csv.writer(csv_out) # 写入表头 csv_writer.writerow(['URL', 'TITLE', 'PRICE']) # 写入每条数据 for row in results: csv_writer.writerow([row['url'], row['title'], row['price']])
代码说明
- 定位独立单元:以每个
cl-static-search-result类的li标签为单位,确保每个条目内的URL、标题、价格是一一对应的,避免全局遍历导致的重复。 - 精准提取内容:在每个li标签内部查找对应的a、title、price元素,只获取当前条目下的信息。
- 数据清洗:用
strip()去除文本和URL前后的空格,保证数据整洁。 - CSV写入优化:只打开一次文件,一次性写入所有数据,避免重复覆盖。
内容的提问来源于stack exchange,提问作者user3618585
相关产品推荐
相关产品推荐

