我美丽的汤刮刀没有按预期工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我美丽的汤刮刀没有按预期工作相关的知识,希望对你有一定的参考价值。

我想从以下网页中提取成分列表:

https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/

所以我要拉的第一种成分是乙酰化羊毛脂,最后一种成分是棕榈酸辛酯。

查看此URL的页面源,我了解到成分列表的模式如下所示:

<td valign="top" width="33%">Acetylated Lanolin <sup>5</sup></td>

所以我写了一些代码来拉取列表,它给了我零结果。下面是代码。

import requests
r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/')
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')

results = soup.find_all('td', attrs={'valign':'top'})

当我尝试len(results)时,它给了我一个零。

我究竟做错了什么?为什么我无法按预期提取列表?我是网络刮刀的初学者。

答案

您的网络抓取代码正在按预期工作。但是,您的请求无效。如果您检查请求的状态代码,则可以看到您获得403状态。

r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/')
print(r.status_code) # 403

会发生什么是服务器不允许非浏览器请求。要使其工作,您需要在发出请求时使用标头。此标头应与浏览器发送的类似:

headers = {
    'User-Agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) '
                   'AppleWebKit/537.36 (KHTML, like Gecko) '
                   'Chrome/56.0.2924.76 Safari/537.36')
}

r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/', headers=headers)

from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
results = soup.find_all('td', attrs={'valign':'top'})
print(len(results))
另一答案

你的汤要求是禁止的。

因此,您无法抓取它。似乎网站正在阻止抓取。

print(soup)

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr/><center>nginx</center>
</body>
</html>

以上是关于我美丽的汤刮刀没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

美丽的汤正则表达式

美丽的汤 CSS 选择器没有找到任何东西

美丽的汤:“ResultSet”对象没有“find_all”属性?

如何在带有 BS4 的 HTML 代码中找到这个通用标签(美丽的汤)

美丽的汤正则表达列表中的Python循环[重复]

美丽的汤和提取价值