python:排除字符串正则表达式

时间:2016-01-24 13:26:30

标签: python regex

我试图建立一个网络刮刀来降低价格http://fetch.co.uk/dogs/dog-food?per-page=20

我的代码如下:

import re
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen(url above)
bsObj = BeautifulSoup(html,"html.parser")

wrapList = bsObj.findAll("",{"class": re.compile("shelf-product__self.*")})
for wrap in wrapList:
    print(wrap.find("",{"itemprop": re.compile("shelf-product__price.*(?!cut).*")}).get_text())
    print(wrap.find("",{"class": re.compile("shelf-product__title.*")}).get_text())

在每一个包装中,有时会有两种不同的价格,我试图排除降价并只得到低于该价格的价格(促销价)。

我无法弄清楚如何用cut来排除价格,上面的表达不起作用。

"shelf-product__price shelf-product__price--cut [ v2 ]"
"shelf-product__price shelf-product__price--promo [ v2 ]"

我已经使用了下面的解决方法,但我想了解我在正则表达式中出错了什么。对不起,如果代码不漂亮,我正在学习

import re
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen(url above)
bsObj = BeautifulSoup(html,"html.parser")

wrapList = bsObj.findAll("",{"class": re.compile("shelf-product__self.*")})
for wrap in wrapList:
    print(wrap.find("",{"itemprop": re.compile("price.*")}).get_text())
    print(wrap.find("",{"class": re.compile("shelf-product__title.*")}).get_text())

2 个答案:

答案 0 :(得分:1)

有一些问题。首先,.*(?!cut).*相当于.*。这是因为第一个.*消耗了所有剩余的字符。然后当然(?!cut)检查通过,因为它在字符串的末尾。最后.*消耗0个字符。所以它总是匹配。这个正则表达式会给你误报。它没有给您任何帮助的唯一原因是,当您要查找的文字位于itemprop时,您正在查看class

您的解决方法对我来说很好。但是如果你想把你的搜索基于类,我就会这样做。

import re
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen('http://fetch.co.uk/dogs/dog-food?per-page=20')
bsObj = BeautifulSoup(html,"html.parser")

wrapList = bsObj.findAll("",{"class": "shelf-product__self"})

def is_price(tag):
    return tag.has_attr('class') and \
           'shelf-product__price' in tag['class'] and \
           'shelf-product__price--cut' not in tag['class']

for wrap in wrapList:
    print(wrap.find(is_price).text)
    x=wrap.find("",{"class": "shelf-product__title"}).get_text()

正则表达式很好,但我认为使用布尔值更容易做布尔逻辑。

答案 1 :(得分:0)

为什么要使用下面可能尝试的复杂代码 - .circle { width: 49%; padding-bottom: 49%; border-radius: 50%; background-color: purple; z-index: 2; position: relative; display: inline-block; } .container .row .col-xs-4 { padding-right: 0; padding-left:0; margin-left: 0; margin-right: 0; border: 1px solid black; text-align:center; } .container { position: relative; } .line { width: 66.6%; height: 1px; background: #000; position: absolute; top: 50%; left: 16.65%; /* Half the circle's width **/; }表示选择属性<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/> <div class="container"> <div class="row"> <div class="col-xs-4"> <div class="circle"></div> </div> <div class="col-xs-4"> <div class="circle"></div> </div> <div class="col-xs-4"> <div class="circle"></div> </div> </div> <div class="line"></div> </div>span[itemprop=price]的所有span

itemprop