Удалите ненужные символы из строки с помощью BeautifulSoup Python при выборе слов из строки - PullRequest
0 голосов
/ 30 января 2019

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

По сути, у меня есть программа для очистки нужных мне данных с веб-сайта, но когда он печатает выбранные слова / элементы из строки "specs", он также печатает такие символы, как [] и '' изстрока.

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

То, что я получаю с текущей программой, это:

['Ручной'] ['Бензин'] ['86,863 миль']

Что я хотел бы получитьВ результате печати можно получить следующий результат:

Manual, Petrol, 86 863 миль

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

Я попытался .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", "Image Link", 
"Gearbox", "Fuel", "Mileage"])

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.rstrip()
        image_link = a.parent.parent.find('img')['src']
        image = ("https:") + image_link
        vehicle_details = a.parent.parent.find('ul', class_='specs')
        specs = list(vehicle_details.stripped_strings)
        gearbox = specs[3:]
        fuel = specs[1:2]
        mileage = specs[0:1]
        writer.writerow([link, make, model, price, image, gearbox, fuel, mileage])
        print(link, make, model, price, image, gearbox, fuel, mileage)

outfile.close()

Ответы [ 2 ]

0 голосов
/ 30 января 2019

, если вы хотите получить строку из списка, возможно, вы можете сделать это

gearbox = specs[3:][0] if specs[3:] else '-'
fuel = specs[1:2][0]  if specs[1:2] else '-'
mileage = specs[0:1][0]  if specs[0:1] else '-' 

, но этот ответ или ответ aldnav выдаст ложный результат, даже если возникнет ошибка

ValueError: недостаточно значений для распаковки

Обычно я сначала извлекаю родительский контейнер, а не выбираю дочерний (a), затем перехожу к родительскому.

# helper to get dynamic specs element
def getSpec(element, selector):
    spec = element.select_one(selector)
    return spec.nextSibling.string.strip() if spec else '-'

soup = BeautifulSoup(get_text, 'html.parser')
results = soup.find_all('div', class_="result-contain")

for car in results:
    a = car.find('a')
    if not a:
        continue
    link = ("https://www.pistonheads.com" + a['href'])
    make = (a['href'].split('/')[-4])
    model = (a['href'].split('/')[-3])
    price = a.find('span').text.rstrip()
    image_link = car.find('img')['src']
    image = ("https:") + image_link

    if not car.find('ul', class_='specs'):
        gearbox = fuel = mileage = '-'
    else:
        gearbox = getSpec(car, '.location-pin-4')
        fuel = getSpec(car, '.gas-1')
        mileage = getSpec(car, '.gauge-1')
    print(gearbox, fuel, mileage)
    writer.writerow([link, make, model, price, image, gearbox, fuel, mileage])
    #print(link, make, model, price, image, gearbox, fuel, mileage)

outfile.close()
0 голосов
/ 30 января 2019

Добро пожаловать в StackOverflow!

Так что ваш сценарий может многое улучшить.Вы попадаете туда!

  • specs = list(vehicle_details.stripped_strings) - это генератор, преобразованный в список.По сути, вы получаете доступ по индексу того, что вы хотите.Например, mileage может быть просто specs[0].
  • Проблема, которую вы получаете дополнительно [ и ], вызвана использованием нарезки mileage = specs[0:1].Из документации индексирование возвращает элемент, нарезка возвращает новый список .См. введение в списки .
  • (Необязательно) И, наконец, чтобы получить всю эту информацию в одной строке, вы можете выполнить несколько назначений из списка спецификаций.См. несколько назначений.
mileage, fuel, _, gearbox = specs
  • Бонусный совет В случае сомнений используйте pdb .
mileage = specs[0]
import pdb; pdb.set_trace()  # temp set on one line so you can remove it easily after
# now you can interactively inspect your code
(Pdb) specs

Удачи!И наслаждайтесь Python!

...