Как мне разобрать строку в поисках конкретных слов / цифр и отобразить их, если они найдены - PullRequest
0 голосов
/ 06 февраля 2019

Я уверен, что написал довольно сомнительный код, но, похоже, он справляется со своей задачей.Проблема в том, что он печатает данные в электронную таблицу и в столбце, где я надеюсь найти год транспортного средства, если первое слово в объявлении не является годом, то в нем отображается первое слово, которое может быть изготовителем.

По сути, я хочу установить операторы if так, чтобы, если год автомобиля не был в первом слове, но находился где-то еще в строке, он все еще находил его и печатал в моем .csv.

Кроме того, я некоторое время пытался разобрать несколько страниц и надеялся, что кто-то здесь тоже может помочь с этим.В URL-адресе есть page = 2 и т. Д., Но я не могу заставить его проанализировать все URL-адреса и получить данные на всех страницах.На данный момент все, что я пробовал, делает только первую страницу.Как вы уже догадались, я довольно новичок в 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()

Пожалуйста, кто-нибудь может мне помочь с этим?Я понимаю, что если утверждения в нижней части могут быть далеко.

Код успешно получает первое слово из строки, просто обидно, что структура данных не всегда год выпуска автомобиля (год)

1 Ответ

0 голосов
/ 07 февраля 2019

Комментарий "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, чтобы найти первый элемент не в списке стоп-слов.

  2. Список создателей
    Создайте список создателей, например ['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встретил кондитион 4 цифры

        # Verify 'year'
        if not (len(year) == 4 and year.isdigit()):
    
  • Зациклить все 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, равны 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

...