如何解析字符串以查找特定的单词/数字,并在显示时显示它们

时间:2019-02-06 18:59:44

标签: python python-3.x beautifulsoup screen-scraping

我确定我已经写了一些相当可疑的代码,但这似乎可以解决问题。问题是,如果广告中的第一个单词不是年份,它会将数据打印到电子表格中,并希望在该列中查找车辆的年份,然后显示可能是制造商的第一个单词。

基本上,我想设置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)

1 个答案:

答案 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',您有两个选项。

  1. 停止单词列表
    使用['full', 'restored', etc.]loop title_items之类的词建立停用词列表,以在停用词列表中找到第一 not

  2. 制造商列表
    建立['Mercedes', 'Datsun', etc.]之类的looptitle_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}}为makemodel

            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