首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法以某种自定义的方式排列刮过的内容

无法以某种自定义的方式排列刮过的内容
EN

Stack Overflow用户
提问于 2020-07-14 12:59:39
回答 3查看 70关注 0票数 1

我正试着从carmodelload上刮本网页。我写的脚本可以完美地解析它们。然而,我不能做的是以一种定制的方式安排它们。

我试过:

代码语言:javascript
运行
复制
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)

此时脚本产生的输出:

代码语言:javascript
运行
复制
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']

我希望得到的输出(显示前几个):

代码语言:javascript
运行
复制
Audi A1 75kg
Audi A3 75kg
Audi A4 90kg
Audi A5 90kg
Audi A6 100kg

如何使脚本产生类似于第二个输出的输出?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-14 13:21:31

您可以使用内置的zip()函数.

例如:

代码语言:javascript
运行
复制
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

指纹:

代码语言:javascript
运行
复制
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电视编辑:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-07-14 13:37:04

下面是实现相同输出的另一种方法:

代码语言:javascript
运行
复制
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)

产出如下:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-07-14 14:02:34

您有两个很好的答案,但是如果您想用小补丁运行您的代码,请尝试如下:

代码语言:javascript
运行
复制
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)

产出:

代码语言:javascript
运行
复制
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 ,并循环遍历cars。allcars包含汽车制造商、模式和负载的列表:

代码语言:javascript
运行
复制
[['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....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62895802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档