用Python从<span></span>中提取值到.csv,并将结果打印出来

2024-10-04 09:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经设法建立了一个非常原始的程序,从活塞头刮取车辆数据,并将其打印到一个.csv文件与链接,使,模型和获得价格,这是我遇到的问题工作。你知道吗

我想把价格刮到我的.csv文件(Price)的第四栏,并在网站上正确打印每辆车的价格。你知道吗

我只需要打印一辆车的价格,然后在.csv文件中的每辆车旁边重复一遍。你知道吗

我试过soup.findAllsoup.find_all查看通过多个元素进行解析是否有效,但这只会造成更大的混乱。你知道吗

有人能帮忙吗?你知道吗

我还试图刮取图像src,并希望将其打印在另一个名为images的列(5)上。你知道吗

import csv ; import requests

from bs4 import BeautifulSoup

outfile = open('pistonheads.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(["Link", "Make", "Model", "Price"])

url = 'https://www.pistonheads.com/classifieds?Category=used-cars&Page=1&ResultsPerPage=100'

get_url = requests.get(url)

get_text = get_url.text

soup = BeautifulSoup(get_text, 'html.parser')

car_link = soup.find_all('div', 'listing-headline', 'price')

for div in car_link:
   links = div.findAll('a')
      for a in links:
      link = ("https://www.pistonheads.com" + a['href'])
      make = (a['href'].split('/')[-4])
      model = (a['href'].split('/')[-3])
      price = soup.find('span')
      writer.writerow([link, make, model, price])
      print(link, make, model, price)
outfile.close()

Tags: 文件csvtextimportdivurlgetlink
2条回答

你可以试试这个:

import csv, requests, re
from urllib.parse import urlparse
from bs4 import BeautifulSoup as soup
d = soup(requests.get('https://www.pistonheads.com/classifieds?Category=used-cars&ResultsPerPage=100').text, 'html.parser')
def extract_details(_s:soup) -> list:
  _link = _s.find('a', {'href':re.compile('/classifieds/used\-cars/')})['href']
  _, _, make, model, *_ = _link[1:].split('/')
  price, img = _s.find('div', {'class':'price'}).text, [i['src'] for i in _s.find_all('img')]
  return [_link, make, model, price, 'N/A' if not img else img[0]]

with open('filename.csv', 'w') as f:
  _listings = [extract_details(i) for i in d.find_all('div', {'class':'ad-listing'}) if i.find('div', {'class':'price'})]
  write = csv.writer(f)
  write.writerows([['make', 'model', 'price', 'img'], *_listings])

原因是price = soup.find('span')

.find()将获取它找到的第一个元素。你让它查看你的soup对象。但是你想要它看的地方,在你的a之内,因为这就是你用for a in links:循环的地方

我还添加了.text,因为我假设您只需要文本,而不是整个标记元素。即price = a.find('span').text

import csv ; import requests

from bs4 import BeautifulSoup

outfile = open('pistonheads.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(["Link", "Make", "Model", "Price", 'Images'])

url = 'https://www.pistonheads.com/classifieds?Category=used-cars&Page=1&ResultsPerPage=100'

get_url = requests.get(url)

get_text = get_url.text

soup = BeautifulSoup(get_text, 'html.parser')

car_link = soup.find_all('div', 'listing-headline', 'price')

for div in car_link:
   links = div.findAll('a')
   for a in links:
      link = ("https://www.pistonheads.com" + a['href'])
      make = (a['href'].split('/')[-4])
      model = (a['href'].split('/')[-3])
      price = a.find('span').text
      image_link = a.parent.parent.find('img')['src']
      image = link + image_link
      writer.writerow([link, make, model, price, image])
      print(link, make, model, price, image)



outfile.close()

相关问题 更多 >