【问题标题】:Selecting div ID in beautifulsoup4在 beautifulsoup4 中选择 div ID
【发布时间】:2020-11-15 12:03:10
【问题描述】:

请放轻松,这是我的第一个 bs4 网络爬虫!我正在尝试为二手商品网站上的价格选择一个 div ID。这是价格框的检查元素部分:

  <div class="price-box">

  <div id="priceBox-price" class="price" itemprop="price" content="879,00">

                €&nbsp;879,-         
    </div>

这是我的python代码:

import requests
import bs4

def scrape_site(url):                       
    res = requests.get()
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    price = soup.find("div", class_= "price")
    print(price)

print(price) 返回“无”。我尝试将许多类 ID 和其他 div ID 传递给 soup.findsoup.select,但不幸的是,我似乎无法从框中提取数字。

我还想在此页面上选择许多其他元素并将它们添加到已经初始化的全局可用列表中。传递soup.find 多个类ID(或此处的任何解决方案)或将找到的soup 对象附加到列表中的多行更有效?

这是一个我想从中提取价格、颜色、位置和修改/发布日期的广告示例:

https://www.willhaben.at/iad/kaufen-und-verkaufen/d/serious-valparola-pro-rennrad-422463471/

非常感谢任何帮助!

编辑:

无论我改变什么变量,.get 都不起作用。这是我当前的完整代码,所有函数返回(没有.get)都是“无”

from bs4 import BeautifulSoup

#list initialisation for data storage

name = []
address = []
colour = []
price = []
last_edited = []


def scrape_site(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content,'html.parser') #.get('content')
    price = soup.find('div',{'itemprop':'price'})
    print(price)

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    试着改变这一行

    price = soup.find("div", class_= "price")
    

    到这里

    price = soup.find_all("div", attrs={"class":'price'})
    

    【讨论】:

    • 现在它只返回一个空列表 [ ]
    【解决方案2】:

    试试这个:

    In [51]: from bs4 import *
    
    In [52]: soup = BeautifulSoup('''  <div class="price-box">
        ...:
        ...:   <div id="priceBox-price" class="price" itemprop="price" content="879,00">
        ...:
        ...:                 &nbsp;879,-
        ...:     </div>''', 'html.parser')
    
    In [53]: soup.find('div',{'itemprop':'price'}).get('content')
    Out[53]: '879,00'
    

    根据您的评论:

    import pandas ad pd
    data = []
    list_of_ad_urls = ['url1','url2', 'url3']
    for url in list_of_ad_urls:
        page = requests.get(url)
        soup = BeautifulSoup(page.content,'html.parser')
        required_item_1 = soup.find(logic to find element 1)
        price = soup.find('div',{'itemprop':'price'}).get('content')
        required_item_3 = soup.find(logic to find element 3)
        data.append([required_item_1, required_item_2, required_item_3])
    
    pd.DataFrame(data).to_csv('mydata.csv', index=False, header='h1,h2,h3'.split(','))
    

    【讨论】:

    • 有什么办法可以调整它,这样我就不必在我的代码中传递实际的 HTML 了吗?我想抓取多达 100 个广告,从页面中获取大量元素,将它们存储在列表中,然后将数据导入到 excel 文件中
    • 太棒了!非常感谢你的帮助。还有一件事:我在价格行的.get 上收到了一个AttributeError。 AttributeError: 'NoneType' object has no attribute 'get'
    • 确保 BeautifulSoup 对象已成功创建,然后确保 soup.find('div', {'itemprop':'price'}) 返回一个元素。从您评论中的错误来看,在 div 中找不到具有此 itemprop 的对象。
    • 我已经尝试了到目前为止我所知道的一切。你能看看我在主帖中的编辑吗?
    • 我看过了。问题出在网站上。检查时可以看到相同的元素,但源代码不同。商品价格等在运行时使用页面中的 json 对象加载。
    猜你喜欢
    • 2015-11-07
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多