【发布时间】:2018-05-03 05:00:10
【问题描述】:
我正在尝试从网站上抓取一些信息。我能够成功地抓取我正在寻找的文本,但是当我尝试创建一个将文本附加在一起的函数时,我得到了一个不可散列类型的 TypeError。
你知道这里会发生什么吗?有谁知道如何解决这个问题?
这里是有问题的代码:
records = []
for result in results:
name = result.contents[0][0:-1]
这里是完整的代码,用于复制目的:
import requests
from bs4 import BeautifulSoup
r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/')
soup = BeautifulSoup(r.text, 'html.parser')
results = soup.find_all('td', attrs={'valign':'top'})
records = []
for result in results:
name = result.contents[0][0:-1]
results 项目的样本:
<td valign="top" width="33%">Acetylated Lanolin <sup>5</sup></td>,
<td valign="top" width="33%">Coconut Butter<sup> 8</sup></td>,
...
<td valign="top" width="33%"><sup> </sup></td>
提前致谢!!
【问题讨论】:
-
该错误消息几乎总是意味着您认为您有一个列表(或其他序列),但实际上您有一个 dict(或其他映射)。错误消息可能会更好一些,但重点是:从 dict 中切出一个范围没有任何意义。
-
至于如何修复它……嗯,这取决于
contents[0]中的内容、您认为其中的内容以及您希望[0:-1]选择的内容。 -
>>> first_result = results[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'results' is not defined这就是我得到的:| -
当我运行这个时,我从网络服务器收到一个 403 错误,这当然意味着汤最终是空的,结果是空的,并且您的错误无法重现。同样,如果你去掉
requests和bs4的东西,只给我们一个results的示例字符串来证明问题,那会好得多。如果不清楚如何缩小问题范围,请阅读minimal reproducible example;真的很有帮助。 -
results= <td valign="top" width="33%">Acetylated Lanolin <sup>5</sup></td>甚至不是有效代码。
标签: python function loops beautifulsoup scraper