提取没有span class属性和相同div class属性的html

2024-10-02 02:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现了类似的问题,但没有一个能直接解决我的问题。我已经做了大约一个星期了,运气不好

我正试图从这个链接中获取数据:https://www.truecar.com/prices-new/chevrolet/malibu-pricing/?zipcode=44070

问题是,我要查找的值没有span class属性,但在使用div class属性时,它与页面上的其他值共享相同的名称。我希望我的代码返回$22807,但是我尝试的任何东西都返回$25195或[]。请参阅以下HTML:

<div class="text-right col-3 col-sm-4 col-md-6">
    <div class="label-block label-block-1 label-block-sm-2 text-muted" data-qa="vehicle-header-msrp" 
    data-test="vehicleHeaderMsrp">
        <div class="label-block-title" data-qa="LabelBlock-title" data-test="labelBlockTitle"></div>
        <div class="label-block-subtitle" data-qa="LabelBlock-subTitle" data-test="labelBlockSubTitle"></div>
        <div data-qa="LabelBlock-text" class="label-block-text" data-test="labelBlockText">
            <span class="pricing-block-amount-strikethrough">$25,195</span>
          </div>
     </div>
</div>


<div class="text-right col-3 col-sm-4 col-md-6">
    <div class="label-block label-block-1 label-block-sm-2" data-qa="vehicle-header-average-market-price" 
    data-test="vehicleHeaderAverageMarketPrice">
        <div class="label-block-title" data-qa="LabelBlock-title" data-test="labelBlockTitle"></div>
        <div class="label-block-subtitle" data-qa="LabelBlock-subTitle" data-test="labelBlockSubTitle"></div>
        <div data-qa="LabelBlock-text" class="label-block-text" data-test="labelBlockText">
            <span class="">$22,807</span>
          </div>
     </div>
</div>

我可以通过以下代码轻松获得返回的$25195:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re

headers = {
   "User-Agent":
   "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20190101 Firefox/70.0"
}

url = "https://www.truecar.com/prices-new/chevrolet/malibu-pricing/?zipcode=44070"
print(url)
page = requests.get(
url,
headers=headers)
    
soup = BeautifulSoup(page.content, 'html.parser')

test = soup.find('span', {'class': 'pricing-block-amount-strikethrough'})
print(test.get_text())

但我尝试的电话组合不会返回我需要的22807美元

有趣的是,如果我使用

test = soup.find('div', {'class': 'label-block label-block-1 label-block-sm-2 text-muted'})

因此,我假设我可以简单地删除“文本静音”部分,如:

test = soup.find('div', {'class': 'label-block label-block-1 label-block-sm-2'})

获取22美元的数字,但它只返回[]

免责声明:我需要的美元金额经常变化,因此,如果您在这方面提供帮助,最终得到的数字与22807美元略有不同,它可能仍然是正确的。如果你点击链接,我要找的数字是“市场平均水平”,而不是“MSRP”

谢谢大家!


Tags: texttestimportdivdatatitlecolblock
1条回答
网友
1楼 · 发布于 2024-10-02 02:36:04

如果您浏览页面,它需要时间才能获得您要查找的第二个值。在“请求”模块中,它可以快速获取内容,而不必等待内容完全加载。这就是添加含bs4的硒元素的地方。添加等待站点加载,然后获取页面内容

你可以从link下载geckodriver

import time
from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://www.truecar.com/prices-new/chevrolet/malibu-pricing/?zipcode=44070"

driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
time.sleep(7)
soup = BeautifulSoup(driver.page_source, 'html')
div = soup.find_all('div', {'class': 'label-block-text'})
for x in div:
    span = x.find('span')
    print(span.get_text())

相关问题 更多 >

    热门问题