我确定我已经写了一些相当可疑的代码,但这似乎可以解决问题。问题是,如果广告中的第一个单词不是年份,它会将数据打印到电子表格中,并希望在该列中查找车辆的年份,然后显示可能是制造商的第一个单词。
基本上,我想设置if语句,以便如果车辆年份不在第一个单词中,而是在字符串中的其他位置,它仍会找到它并将其打印到我的.csv中。
此外,我一直在努力解析多个页面,并希望这里的人也可以提供帮助。网址中包含page = 2等,但我无法通过所有网址解析它并获取所有页面上的数据。目前,我尝试过的所有内容都只显示首页。您可能已经猜到了,我是Python的新手。
import csv ; import requests
from bs4 import BeautifulSoup
outfile = open('carandclassic-new.csv','w', newline='', encoding='utf-8')
writer = csv.writer(outfile)
writer.writerow(["Link", "Title", "Year", "Make", "Model", "Variant", "Image"])
url = 'https://www.carandclassic.co.uk/cat/3/?page=2'
get_url = requests.get(url)
get_text = get_url.text
soup = BeautifulSoup(get_text, 'html.parser')
car_link = soup.find_all('div', 'titleAndText', 'image')
for div in car_link:
links = div.findAll('a')
for a in links:
link = ("https://www.carandclassic.co.uk" + a['href'])
title = (a.text.strip())
year = (title.split(' ', 1)[0])
make = (title.split(' ', 2)[1])
model = (title.split(' ', 3)[2])
date = "\d"
for line in title:
yom = title.split()
if yom[0] == "\d":
yom[0] = (title.split(' ', 1)[0])
else:
yom = title.date
writer.writerow([link, title, year, make, model])
print(link, title, year, make, model)
outfile.close()
请有人可以帮助我吗?我意识到底部的if语句可能会偏离。
该代码成功地从字符串中获取了第一个单词,但遗憾的是,数据的结构方式并不总是汽车的制造年份(yom)
答案 0 :(得分:3)
评论,
"1978 Full restored Datsun 280Z"
变成'1978' '1978' '280Z'
。
而不是'1978' 'Datsun' '280z'
要改善year
验证,请更改为使用re
模块:
import re
if not (len(year) == 4 and year.isdigit()):
match = re.findall('\d{4}', title)
if match:
for item in match:
if int(item) in range(1900,2010):
# Assume year
year = item
break
输出变为:
'1978 Full restored Datsun 280Z', '1978', 'Full', '280Z'
关于 false 结果make='Full'
,您有两个选项。
停止单词列表
使用['full', 'restored', etc.]
和loop
title_items
之类的词建立停用词列表,以在停用词列表中找到第一项 not
制造商列表
建立['Mercedes', 'Datsun', etc.]
之类的loop
和title_items
build-in
之类的制造商列表,以找到第一匹配项。
问题:如果广告中的第一个单词不是年份,请查找车辆的年份
使用了module
和# Simulating html Element
class Element():
def __init__(self, text): self.text = text
for a in [Element('Mercedes Benz 280SL 1980 Cabriolet in beautiful condition'),
Element('1964 Mercedes Benz 220SEb Saloon Manual RHD')]:
:
使用的示例标题:
title
从<a
Element
获取blanks
并除以 title = a.text.strip()
title_items = title.split()
。
title_items
默认值为0, 1, 2
处的 # Default
year = title_items[0]
make = title_items[1]
model = title_items[2]
。
year
验证 # Verify 'year'
if not (len(year) == 4 and year.isdigit()):
是否满足 4位数字
item
在title_items
中循环所有 # Test all items
for item in title_items:
if len(item) == 4 and item.isdigit():
# Assume year
year = item
break
,如果满足条件则中断。
title_items
假定为索引0, 1
的{{1}}为make
和model
make = title_items[0]
model = title_items[1]
检查model
是否以数字开头
注意:如果模型不符合此条件,将失败!
# Condition: Model have to start with digit
if not model[0].isdigit():
for item in title_items:
if item[0].isdigit() and not item == year:
model = item
print('{}'.format([title, year, make, model]))
输出:
['Mercedes Benz 280SL 1980 Cabriolet in beautiful condition', '1980', 'Mercedes', '280SL'] ['1964 Mercedes Benz 220SEb Saloon Manual RHD', '1964', 'Mercedes', '220SEb']
使用Python测试:3.4.2