【问题标题】:BeautifulSoup (Python): how grab text-string next to a tag (that may or may not exist)?BeautifulSoup (Python):如何抓取标签旁边的文本字符串(可能存在也可能不存在)?
【发布时间】:2022-02-14 14:12:08
【问题描述】:

我认为我的标题很好地解释了我面临的问题。让我们看一下问题的图片。 (您可以在this 地址找到网页,但它可能已更改)。

我已经用蓝色突出显示了我要抓取的文本,这是 2008 年的车型年。现在,卖家不需要提交车型年,所以这可能存在也可能不存在。但是当它确实存在时,它总是跟随<i> 标记和class ="fa fa-calender"。到目前为止,我的解决方案是获取所有文本 whitin <p class="result-details> ... </p>"(然后变成一个列表),然后选择第二个元素,条件是 <i class="fa fa-calender> ... </i> 存在。否则我什么都抓不到。

现在,这似乎通常不起作用,因为如果第二个元素之前的文本中有空格,则可以将其排列成多个元素。那么,有没有什么方法(任何函数)可以抓取与我图片中看到的另一个标签相邻的文本字符串?

PS:如果我让自己不清楚,我只想从网页上的帖子中获取 2008 年(如果存在)。

编辑

在这种情况下,我的代码错误地给出了“Hjulvältar”(英语中的推土机)这个词,而不是 2008 年。

代码

from bs4 import BeautifulSoup
from datetime import date
import requests

url_avvikande = ['bomliftar','teleskop-bomliftar','kompakta-sjalvgaende-bomlyftar','bandschaktare','reachstackers','staplare']
today = date.today().isoformat()

url_main = 'https://www.mascus.se'
produktgrupper = ['lantbruksmaskiner','transportfordon','skogsmaskiner','entreprenadmaskiner','materialhantering','gronytemaskiner']
kategorier = {
  'lantbruksmaskiner': ['traktorer','sjalvgaende-falthackar','skordetroskor','atv','utv:er','snoskotrar'],
  'transportfordon': ['fordonstruckar','elektriska-fordon','terrangfordon'],
  'skogsmaskiner': ['skog-skordare','skog-gravmaskiner','skotare','drivare','fallare-laggare','skogstraktorer','lunnare','terminal-lastare'],
  'entreprenadmaskiner': ['gravlastare','bandgravare','minigravare-7t','hjulgravare','midigravmaskiner-7t-12t','atervinningshanterare','amfibiska-gravmaskiner','gravmaskiner-med-frontskopa','gravmaskiner-med-lang-rackvidd','gravmaskiner-med-slapskopa','rivningsgravare','specialgravmaskiner','hjullastare','kompaktlastare','minilastmaskiner','bandlastare','teleskopiska-hjullastare','redaskapshallare','gruvlastare','truckar-och-lastare-for-gruvor','bergborriggar','teleskoplastare','dumprar','minidumprar','gruvtruckar','banddumprar','specialiserade-dragare','vaghyvlar','vattentankbilar','allterrangkranar','terrangkranar-grov-terrang','-bandgaende-kranar','saxliftar','bomliftar','teleskop-bomliftar','personhissar-och-andra-hissar','kompakta-sjalvgaende-bomlyftar','krossar','mobila-krossar','sorteringsverk','mobila-sorteringsverk','bandschaktare','asfaltslaggningsmaskiner','--asfaltskallfrasmaskiner','tvavalsvaltar','envalsvaltar','jordkompaktorer','pneumatiska-hjulvaltar','andra-valtar','kombirullar','borrutrustning-ytborrning','horisontella-borrutrustning','trenchers-skar-gravmaskin'],
  'materialhantering': ['dieseltruckar','eldrivna-gaffeltruckar','lpg-truckar','gaffeltruckar---ovriga','skjutstativtruck','sidlastare','teleskopbomtruckar','terminaltraktorer','reachstackers','ovriga-materialhantering-maskiner','staplare-led','staplare','plocktruck-laglyftande','plocktruck-hoglyftande','plocktruck-mediumlyftande','dragtruck','terrangtruck','4-vagstruck','smalgangstruck','skurborsttorkar','inomhus-sopmaskiner','kombinationsskurborstar'],
  'gronytemaskiner': ['kompakttraktorer','akgrasklippare','robotgrasklippare','nollsvangare','plattformsklippare','sopmaskiner','verktygsfraktare','redskapsbarare','golfbilar','fairway-grasklippare','green-grasklippare','grasmattevaltar','ovriga-gronytemaskiner']
  }

url = 'https://www.mascus.se'
mappar = ['Lantbruk', 'Transportfordon', 'Skogsmaskiner', 'Entreprenad',  'Materialhantering', 'Grönytemaskiner']
index = -1
status = True
for produktgrupp in kategorier:
  index += 1
  mapp = mappar[index]
  save_path = f'/home/protector.local/vika99/webscrape_mascus/Annonser/{mapp}'
  underkategorier = kategorier[produktgrupp]
  for underkategori in underkategorier:
        # OBS
        if underkategori != 'borrutrustning-ytborrning' and status:
              continue
        else:
              status = False
        # OBS
        if underkategori in url_avvikande:
              url = f'{url_main}/{produktgrupp}/{underkategori}'
        elif underkategori == 'gravmaskiner-med-frontskopa':
              url = f'{url_main}/{produktgrupp}/begagnat-{underkategori}'
        elif underkategori == 'borrutrustning-ytborrning':
              url = f'{url_main}/{produktgrupp}/begagnad-{underkategori}'
        else:
              url = f'{url_main}/{produktgrupp}/begagnade-{underkategori}'
        file_name = f'{save_path}/{produktgrupp}_{underkategori}_{today}.txt'
        sida = 1
        print(url)
        with open(file_name, 'w') as f:
              while True:
                    print(sida)
                    html_text = None
                    soup = None
                    links = None
                    while links == None:
                          html_text = requests.get(url).text
                          soup = BeautifulSoup(html_text, 'lxml')
                          links = soup.find('ul', class_ = 'page-numbers')
                    annonser = soup.find_all('li', class_ = 'col-row single-result')
                    for annons in annonser:
                          modell = annons.find('a', class_ = 'title-font').text
                          if annons.p.find('i', class_ = 'fa fa-calendar') != None:
                                tillverkningsar = annons.find('p', class_ = 'result-details').text.strip().split(" ")[1]
                          else:
                                tillverkningsar = 'Ej angiven'
                          try:
                                pris = annons.find('span', class_ = 'title-font no-ws-wrap').text
                          except AttributeError:
                                pris = annons.find('span', class_ = 'title-font no-price').text
                          f.write(f'{produktgrupp:<21}{underkategori:25}{modell:<70}{tillverkningsar:<13}{pris:>14}\n')
                    url_part = None
                    sida += 1
                    try:
                          url_part = links.find('a', text = f'{sida}')['href']
                    except TypeError:
                          print(f'Avläsning av underkategori klar.')
                          break
                    url = f'{url_main}{url_part}'

【问题讨论】:

  • 你的代码在哪里?
  • @baduker 我认为没有必要,给你。
  • 所以到目前为止我收集到的是您试图获取日期但它不在 中所以您必须从

    中获取它对吗?

  • @ShadowGunn 是的,没错。当您直观地查看 HTML 代码时,它似乎并不难破解。它总是出现在&lt;i&gt; 标记之后。
  • @SimpleProgrammer 类测试

标签: python html web-scraping beautifulsoup


【解决方案1】:

当您循环列表时,您可以测试该日历图标类是否存在,如果存在则获取next_sibling

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.mascus.se/entreprenadmaskiner/begagnade-pneumatiska-hjulvaltar')
soup = bs(r.content, 'lxml')
listings = soup.select('.single-result')

for listing in listings:
    
    calendar = listing.select_one('.fa-calendar')
    
    if calendar is not None:
        print(calendar.next_sibling)
    else:
        print('Not present')

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2011-02-01
    • 2017-08-04
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多