【问题标题】:Extract html with no span class attribute and same div class attributes提取没有 span 类属性和相同 div 类属性的 html
【发布时间】:2021-03-08 17:02:51
【问题描述】:

我发现了类似的问题,但没有一个可以直接解决我的问题。我已经为此工作了大约一个星期,但没有运气。

我正在尝试从此链接中抓取数据:https://www.truecar.com/prices-new/chevrolet/malibu-pricing/?zipcode=44070

问题是,我要查找的值没有 span-class 属性,但是当使用 div 类属性时,它与页面上的其他值具有相同的名称。我希望我的代码返回 $22,807,但我尝试的任何操作都返回 $25,195 或 []。请参阅以下 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>

我可以通过以下代码轻松获得返回的 25,195 美元:

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())

但我尝试的调用组合都不会返回我需要的 $22,807

有趣的是,如果我使用,我可以得到 25 美元的价值

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 美元的数字,但它只返回 [ ]。

免责声明:我需要的美元金额经常变化,所以如果你帮助解决这个问题并最终得到一个与 22,807 美元略有不同的数字,它可能仍然是正确的。如果您单击该链接,我要查找的数字是“市场平均值”而不是“厂商建议零售价”。

谢谢!

【问题讨论】:

标签: python html web-scraping beautifulsoup


【解决方案1】:

如果您浏览该页面,它需要一些时间才能获得您正在寻找的第二个值。在请求模块中,它可以快速获取内容,而不是等待它完全加载。这是您使用 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多