【问题标题】:Can't arrange scraped content in some customized manner无法以某种自定义方式排列抓取的内容
【发布时间】:2020-07-14 12:59:39
【问题描述】:

我正在尝试从this webpage 中抓取carmodelload。我编写的脚本可以完美地解析它们。但是,我不能以自定义的方式排列它们。

我试过了:

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']

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用内置的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][1::2] 的工作方式或任何描述它们的链接都会有所帮助。谢谢。
    • 我用 item_content[::2] = 从索引 0 开始并跳转到下一个模型 item_content[1::2] = 从索引 1 开始并跳转到下一个模型来编辑帖子加载但编辑必须得到受信任的社区成员的批准
    【解决方案2】:

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

    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  ✓
    

    【讨论】:

      【解决方案3】:

      你有两个很好的答案,但如果你想通过小修复运行你的代码,试试这个:

      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....
      

      【讨论】:

      • 使用你的解决方案我只得到每个列表的第一项。
      • 现在我已经编辑了我的代码,所以它符合你的愿望。它与 Andrej Kesely 的代码几乎相同,但有点不同
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2023-03-11
      相关资源
      最近更新 更多