2016-12-21 99 views
0

我目前正在从Udemy的Python教程(总新手到Python)学习。 我目前在一个美丽的汤部分,我们正在忙于练习,以刮除作者在亚马逊书上的价格。 我的代码如下:Python - 美丽的汤选择只返回[]

import bs4, requests 
url = 'https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/' 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 

response = requests.get(url, headers=headers) 
response.raise_for_status() 
soup = bs4.BeautifulSoup(response.text, 'html.parser') 
soup.select('#addToCart > a > h5 > div > div.a-column.a-span4.a-text-right.a-span-last > span.a-size-medium.a-color-price.header-price') 

当我检查价格元素的路径,我可以看到这一点:

<span class="a-size-medium a-color-price header-price"> 


      $25.45 



    </span> 

然而,当我复制和由soup.select贴吧并运行python命令,我只返回一个[]即2个方括号。我应该得到第二个代码框的内容。

更新:在我输入问题期间,它确实正确显示了结果,框中的内容为$ 25.45,但是5分钟后它返回仅获取[]括号的结果。我在一个代理之后,并且没有通过代理尝试,结果没有变化。我在做response.raise_for_status()时没有收到任何错误。请有人帮忙吗?

(请记住,我不打算屏幕刮任何商业网站在那里,我非常希望我的学习收获应用到室内场景)

谢谢!

回答

1

你是过度复杂化你的CSS选择器并使其变得脆弱 - 严重依赖于页面布局。您不必通过完整的父子链来查找元素。选择您可以基于您的定位器的最可靠,可读和适当的点。例如,在这种情况下,以下为我的作品:

soup.select('#addToCart .header-price') 
+0

谢谢你,这并不工作 –

+0

soup.select( '搭设尺寸-medium.a色 - price.header价格')也为我工作 –