Не удается настроить скопированный контент каким-либо индивидуальным образом - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь очистить car, model и load с этой веб-страницы . Написанный мной сценарий может безупречно их проанализировать. Однако я не могу расположить их по индивидуальному заказу.

Я пробовал с:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.fjordsen.com/en-eu/vehicles/")
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select(".card-default"):
    item_title = items.select_one("h4.card-title > a").get_text(strip=True)
    item_content = [item.text for item in items.select("td")[2:]]
    print(item_title,item_content)

Вывод скрипта в этот момент:

Audi ['A1', '75kg✓', 'A3', '75kg✓', 'A4', '90kg✓', 'A5', '90kg✓', 'A6', '100kg✓', 'A7', '100kg✓', 'A8', '100kg✓', 'Q2', '75kg✓', 'Q3', '75kg✓', 'Q5', '75kg✓', 'Q7', '75kg✓', 'Q8', '100kg✓']
BMW ['1Serie', '75kg✓', '2SerieActiveTourer', '75kg✓', '2SerieCabrio', '0kg', '2SerieCoupe', '75kg✓', '2SerieGrandCoupe', '75kg✓', '2SerieGrandTourer', '75kg✓', '3Serie', '75kg✓', '3SerieGranTurismo', '75kg✓', '3SerieTouring', '75kg✓', '4SerieCabrio', '0kg', '4SerieCoupe', '75kg✓', '4SerieGranCoupe', '75kg✓', '5Serie', '100kg✓', '5SerieTouring', '100kg✓', '6SerieGranTurismo', '100kg✓', '7Serie', '100kg✓', '8Serie', '75kg✓', '8SerieCabrio', '0kg', '8SerieGranCoupe', '75kg✓', 'i3', 'Checkinstructionmanualforyourcar', 'i8', 'Checkinstructionmanualforyourcar', 'i8Roadster', 'Checkinstructionmanualforyourcar', 'X1', '75kg✓', 'X2', '75kg✓', 'X3', '100kg✓', 'X4', '100kg✓', 'X5', '100kg✓', 'X6', '100kg✓', 'X7', '100kg✓', 'Z4', 'Checkinstructionmanualforyourcar']

Вывод I wi sh, чтобы получить (показаны первые несколько):

Audi A1 75kg
Audi A3 75kg
Audi A4 90kg
Audi A5 90kg
Audi A6 100kg

Как я могу заставить скрипт выдавать результат, аналогичный второму?

Ответы [ 3 ]

3 голосов
/ 14 июля 2020

Вы можете использовать встроенную функцию zip().

Например:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.fjordsen.com/en-eu/vehicles/")
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select(".card-default"):
    item_title = items.select_one("h4.card-title > a").get_text(strip=True)
    item_content = [item.text for item in items.select("td")[2:]]
    for t, w in zip(item_content[::2], item_content[1::2]):
        print(item_title, t, w)  # or print(item_title, t, w.split()[0]) without the `✓` sign

Печать:

Audi A1 75kg  ✓
Audi A3 75kg  ✓
Audi A4 90kg  ✓
Audi A5 90kg  ✓
Audi A6 100kg  ✓
Audi A7 100kg  ✓
Audi A8 100kg  ✓
Audi Q2 75kg  ✓
Audi Q3 75kg  ✓
Audi Q5 75kg  ✓
Audi Q7 75kg  ✓
Audi Q8 100kg  ✓
BMW 1 Serie 75kg  ✓
BMW 2 Serie Active Tourer 75kg  ✓
BMW 2 Serie Cabrio 0kg
BMW 2 Serie Coupe 75kg  ✓
BMW 2 Serie Grand Coupe 75kg  ✓

...and so on.

Редактировать с помощью uwtd tv:

item_content[::2] = starts on index 0 and take 2 jumps to next model

item_content[1::2] = starts in index 1 and take 2 jumps to next load
2 голосов
/ 14 июля 2020

Вот еще один способ достижения того же результата:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.fjordsen.com/en-eu/vehicles/")
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select(".card-default"):
    item_title = items.select_one("h4.card-title > a").get_text(strip=True)
    for elem in items.select("tr"):
        model,weight = [item.text for item in elem.select("td")]
        print(item_title,model,weight)

Результат выглядит примерно так:

Audi Model Maximum roof load while driving
Audi A1 75kg  ✓
Audi A3 75kg  ✓
Audi A4 90kg  ✓
Audi A5 90kg  ✓
Audi A6 100kg  ✓
Audi A7 100kg  ✓
Audi A8 100kg  ✓
Audi Q2 75kg  ✓
Audi Q3 75kg  ✓
Audi Q5 75kg  ✓
Audi Q7 75kg  ✓
Audi Q8 100kg  ✓
BMW Model Maximum roof load
BMW 1 Serie 75kg  ✓
BMW 2 Serie Active Tourer 75kg  ✓
1 голос
/ 14 июля 2020

У вас есть два хороших ответа, но если вы хотите запустить свой код с небольшими исправлениями, попробуйте следующее:

import requests
from bs4 import BeautifulSoup
allcars = []
r = requests.get("https://www.fjordsen.com/en-eu/vehicles/")
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select(".card-default"):
    item_title = items.select_one("h4.card-title > a").get_text(strip=True)
    item_content = [item.text for item in items.select("td")[2:]]
    cars = ([f'{str(item_title)} {m} {l.split(" ")[0]} ' for m, l in zip(item_content[0::2], item_content[1::2])])
    allcars.append(cars)
    for car in cars:
        print(car)

вывод:

Audi A1 75kg 
Audi A3 75kg 
Audi A4 90kg 
Audi A5 90kg 
Audi A6 100kg 
Audi A7 100kg 
Audi A8 100kg 
Audi Q2 75kg 
Audi Q3 75kg 
Audi Q5 75kg...

Этот код создает два списка allcars и другие cars и проходят через автомобили. allcars содержит список списков производителей автомобилей, режимов и загрузки:

[['Audi A1 75kg ', 'Audi A3 75kg ', 'Audi A4 90kg ', 'Audi A5 90kg ', 'Audi A6 100kg ', 'Audi A7 100kg ', 'Audi A8 100kg ', 'Audi Q2 75kg ', 'Audi Q3 75kg ', 'Audi Q5 75kg ', 'Audi Q7 75kg ', 'Audi Q8 100kg '], ['BMW 1 Serie 75kg ', 'BMW 2 Serie Active Tourer 75kg ', 'BMW 2 Serie Cabrio 0kg....
...