2017-05-28 48 views
1

我的第一次在SO上。感谢帮助我们这么长时间的菜鸟。即将直奔点:beautifulsoup CSS选择 - 找到一个特定的属性(样式为前)不存在的标签

情景: 我在现有的程序正在读取CSS选择器从一个配置文件中的字符串,使程序的动态,并能够通过只改变配置放弃任何现场工作CSS选择器的值。

问题: 我试图刮掉其渲染的项目,如下面的两个选项一个网站:

选项1:

......... 
<div class="price"> 
    <span class="price" style="color:red;margin-right:0.1in"> 
    <del>$299</del> 
    </span> 
    <span class="price"> 
    $195 
    </span> 
</div> 

soup = soup.select("span.price") - this doesn't work as I need second span tag or last span tag :(

选项2:

......... 
<div class="price"> 
    <span class="price"> 
    $199 
    </span> 
</div> 

soup = soup.select("span.price") - this works great! 

问题: 在上面的op tions我希望能够获得最后一个span标签(195美元或199美元),并且不在乎299美元。基本上我只是想提取最终的销售价格而不是原价。

所以2点的方法,我知道,截至目前有:

1)总能获得最后的跨度标签 2)总是得到不具有style属性

现在span标记,我知道不是运营商,最后一类是不存在于bs4(只有nth-type型可用),所以我卡在这里。任何建议都有帮助。由于这是一个现有的程序,我不能使用soup.find_all()或除soup.select()以外的任何其他方法。对不起:(

感谢

+0

我不明白你到底需要,但你可以使用显示无德尔 {{{跨越德尔{显示:无; ) –

+0

这本书说最后一类是可用的:https://books.google.nl/books?id=mEu7DQAAQBAJ&pg=PA6&lpg=PA6&dq=bootstrap+4+last-of-type&source=bl&ots=zUmAMxCMG-&sig=kCjR8TivvajvtMlf -gOE5lABA2w&hl = zh-CN&sa = X&ved = 0ahUKEwjUuMrdlJLUAhWOY1AKHQT1AvIQ6AEIVTAH#v = onepage&q = bootstrap%204%20last-of-type&f = false – Gerard

+0

您能分享网址吗?其他尝试soup.select(“span。价格“,{'风格':无}) – Gahan

回答

1

可以为span标签搜索,而不样式属性:。

prices = soup.select('span.price') 
no_style = [price for price in prices if 'style' not in price.attrs] 
>> [<span class="price">$199</span>] 
+0

Thanks Gil。但是因为我正在调用一个现有的程序,它只是调用soup.select方法,因此不能在没有检修整个程序的情况下使用这种方法。 –

+0

确定,我已经编辑了使用soup.select方法的代码,它仍然可以工作,这有帮助吗? –

+0

再次感谢Gil。我应该提到我只使用一个字符串它将在soup.select()方法中传递。如果我要为该程序添加任何附加代码,那么我需要进行全面的测试,并且我还可以在通用基础上使此程序更加灵活。 –

0

这可能是使用功能的好时机。在这种情况下BeautifulSoup给每个span_with_style标签,并且该功能测试标签的name是否为span并且它具有属性style。如果是,则BeautifulSoup将该标签附加到其结果列表中。

HTML = '''\ 
<div class='price'> 
    <span class='price' style='color: red; margin-right: 0.1in'> 
     <del>$299</del> 
    </span> 
    <span class='price'> 
     $195 
    </span> 
</div>''' 
from bs4 import BeautifulSoup 
soup = BeautifulSoup(HTML, 'lxml') 

for item in soup.find_all(lambda tag: tag.name=='span' and tag.has_attr('style')): 
    print (item) 
+0

谢谢比尔。然而,这是一个很好的解决方案,因为我正在改变一个只调用soup.select的现有程序(中的一些字符串)。我不能在没有检修整个程序的情况下调用该函数:( –

+0

现在查看 - –

0

select函数中的代码需要更改为:

def select(soup, the_variable_you_pass): 
    soup.find('div', attrs={'class': 'price'}).find_all(the_variable_you_pass)[-1] 
相关问题