我试图建立一个网络刮刀来降低价格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())
答案 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