gpt4 book ai didi

python - BeautifulSoup find - 从感兴趣的 block 中排除嵌套标签

转载 作者:行者123 更新时间:2023-12-01 01:31:07 24 4
gpt4 key购买 nike

我有一个抓取器,可以在特定产品页面上查找定价。我只对当前价格感兴趣 - 无论产品是否打折。

我将这样的识别标签存储在 JSON 文件中:

{
"some_ecommerce_site" : {
"product_name" : ["span", "data-test", "product-name"],
"breadcrumb" : ["div", "class", "breadcrumbs"],
"sale_price" : ["span", "data-test", "sale-price"],
"regular_price" : ["span", "data-test", "product-price"]
},
}

并具有以下功能来选择当前价格并清理价格文本:

def get_pricing(rpi, spi):
sale_price = self.soup_object.find(spi[0], {spi[1] : spi[2]})
regular_price = self.soup_object.find(rpi[0], {rpi[1] : rpi[2]})

return sale_price if sale_price else regular_price

def get_text(obj):
return re.sub(r'\s\s+', '', obj.text.strip()).encode('utf-8')

调用者:

def get_ids(name_of_ecommerce_site):
with open('site_identifiers.json') as j:
return json.load(j)[name_of_ecommerce_site]

def get_data():
rpi = self.site_ids['regular_price']
spi = self.site_ids['sale_price']

product_price = self.get_text( self.get_pricing(rpi, spi) )

到目前为止,除了一个网站之外,这适用于所有网站,因为它们的定价格式如下:

<div class="product-price">
<h3>
£15.00
<span class="price-standard">
£35.00
</span>
</h3>
</div>

那又怎样product_price返回的是“£15£35”,而不是所需的“£15”。

有没有一种简单的方法来排除嵌套的 <span>哪个不会破坏工作 field ?

我认为解决方案是获取一个列表并选择索引 0,但检查标签的内容,这不起作用,因为它是列表中的单个项目:

>> print(type(regular_price))
>> <class 'bs4.element.Tag'>
>> print(regular_price.contents)
>> [u'\n', <h3>\n\n\xa325.00\n\n<span class="price-standard">\n\n\xa341.00\n</span>\n</h3>, u'\n']

我尝试从结果的 NavigableString 元素中创建一个列表,然后过滤掉空字符串:

filter(None, [self.get_text(unicode(x)) for x in sale_price.find_all(text=True)])

这修复了一种情况,但破坏了其他一些情况(因为它们通常将货币放在与值(value)金额不同的标签中) - 我返回“£”。

最佳答案

如果你想获取没有子元素one的文本,你可以这样做

from bs4 import BeautifulSoup,NavigableString


html = """
<div class="product-price">
<h3>
£15.00
<span class="price-standard">
£35.00
</span>
</h3>
</div>
"""
bs = BeautifulSoup(html,"xml")
result = bs.find("div",{"class":"product-price"})
fr = [element for element in result.h3 if isinstance(element, NavigableString)]
print(fr[0])

question may be duplicate of this

关于python - BeautifulSoup find - 从感兴趣的 block 中排除嵌套标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52855089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com