【问题标题】:How do I pull the div attributes out of these lines with beautiful soup?如何用漂亮的汤从这些行中提取 div 属性?
【发布时间】:2020-09-13 07:53:30
【问题描述】:

我正在使用 bs4 来提取网页的 html 并将每一行拆分为一个列表,以便我可以提取我想要的那些。 (不确定这一步是否通过更改数据类型使下一个步骤变得不可能,如果是,那么执行此步骤的更好方法是什么?)

一旦我有了这个缩小的列表,我就会得到如下所示的单个列表元素:

忽略第一个 之后的空格,否则我无法显示此内容

< div class="row srpVehicle hasVehicleInfo" data-bodystyle="SUV" data-cpo="False" data-engine="V8 engine" data-extcolor="Red" data-extcolorcode="" data-fueltype="Gasoline Fuel" data-intcolor="Jet Black" data-intcolorcode="" data-make="Chevrolet" data-model="Tahoe" data-modelcode="1123706" data-mpgcity="16" data-mpghwy="20" data-msrp="0" data-name="2020 Chevrolet Tahoe LT" data-price="58995" data-stocknum="32948" data-trans="Automatic" data-trim="LT" data-vehicleid="0" data-vehicletype="new" data-vin="1G555555555" data-year="2020" id="srpVehicle-1GNS555513555">

我想提取这些数据点中的每一个; data-bodystyle、data-engine、data-model等,并放入字典中,稍后转换为json。

输出示例:

{'data-bodystyle':'SUV',
    'data-engine':'V8',
    'data-model':'Tahoe'}

使用 bs4 方法是否有更简单的方法来完成此任务?目前,当我缩小范围时,我使用字符串拆分和其他一些操作来提取数据点,但这似乎不能有效地工作。

【问题讨论】:

标签: python python-3.x beautifulsoup


【解决方案1】:

每个标签都有.attrs 属性,其中存储了标签的所有属性。您可以像标准 Python 的字典一样对其进行迭代:

from pprint import pprint
from bs4 import BeautifulSoup

txt = '''<div class="row srpVehicle hasVehicleInfo" data-bodystyle="SUV" data-cpo="False" data-engine="V8 engine" data-extcolor="Red" data-extcolorcode="" data-fueltype="Gasoline Fuel" data-intcolor="Jet Black" data-intcolorcode="" data-make="Chevrolet" data-model="Tahoe" data-modelcode="1123706" data-mpgcity="16" data-mpghwy="20" data-msrp="0" data-name="2020 Chevrolet Tahoe LT" data-price="58995" data-stocknum="32948" data-trans="Automatic" data-trim="LT" data-vehicleid="0" data-vehicletype="new" data-vin="1G555555555" data-year="2020" id="srpVehicle-1GNS555513555">'''
soup = BeautifulSoup(txt, 'html.parser')

out = {}
div = soup.select_one('.hasVehicleInfo')
for a in div.attrs:
    if a.startswith('data-'):
        out[a.replace('data-', '')] = div[a]   # if you want to keep `data-...`, remove `.replace()`

# pretty print to screen:
pprint(out)

打印:

{'bodystyle': 'SUV',
 'cpo': 'False',
 'engine': 'V8 engine',
 'extcolor': 'Red',
 'extcolorcode': '',
 'fueltype': 'Gasoline Fuel',
 'intcolor': 'Jet Black',
 'intcolorcode': '',
 'make': 'Chevrolet',
 'model': 'Tahoe',
 'modelcode': '1123706',
 'mpgcity': '16',
 'mpghwy': '20',
 'msrp': '0',
 'name': '2020 Chevrolet Tahoe LT',
 'price': '58995',
 'stocknum': '32948',
 'trans': 'Automatic',
 'trim': 'LT',
 'vehicleid': '0',
 'vehicletype': 'new',
 'vin': '1G555555555',
 'year': '2020'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多