我设法建立了一个非常原始的程序,以从活塞头上刮除车辆数据,并通过链接,制造,建模将其打印到.csv
文件中,并且正在努力获取价格,这正是我遇到的问题。问题。
我想将价格刮到.csv
文件(Price
)的第四列,并正确打印网站上每种车辆的价格。
我只能得到它来打印一辆车的价格,并在.csv
文件中的每辆车旁边重复一次。
我曾尝试soup.findAll
和soup.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()
答案 0 :(得分:3)
您可以尝试以下方法:
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])
答案 1 :(得分:1)
原因是由于fmt.Printf("%q", Location)
Location = strings.TrimSpace(Location)
将获取其找到的第一个元素。然后,您可以查看price = soup.find('span')
对象。但是您想要查看的地方位于.find()
内,因为这就是您使用soup
遍历的内容
我还添加了a
,因为我假设您只是想要文本,而不是整个tag元素。即for a in links:
.text