【发布时间】:2017-10-19 15:12:28
【问题描述】:
我正在尝试存储从网站上抓取的一些数据。我需要的数据是元素中的文本,然后存储在 csv 中以供以后查询。
在下面的代码中,我找到了对“vip”类的所有引用。然后我想遍历这些以去除不必要的 HTML 以仅获取文本数据。最后我用 utf-8 对其进行编码,准备好插入到 csv 中。
# parse the page and store in var soup
soup = BeautifulSoup(page, 'html.parser')
# find the title
title_box = soup.findAll('a', attrs={'class': 'vip'}}
print title_box
# loop through each iteration
for each in title_box:
if each.find('title_box'):
title = title_box.text.strip().encode('utf-8')
# print the result
print title
但是,每当我打印“标题”的结果时,我都会收到以下错误:
Traceback (most recent call last):
File "/Users/XXXX/Projects/project-kitchenaid/scaper.py", line 28, in <module>
print title
NameError: name 'title' is not defined
据我了解,title 超出范围。如何从循环中检索数据并将其写入打印调用?
就上下文而言,这只是print title_box 的一个结果:
<a class="vip" href="http://www.ebay.co.uk/itm/KITCHENAID-CLASSIC-MIXER-5K45SS-ATTACHMENTS-AND-INSTRUCTIONS-/302468759209?hash=item466c8afea9:g:2PIAAOSwCi9Zvk2D" title="Click this link to access KITCHENAID CLASSIC MIXER 5K45SS - ATTACHMENTS AND INSTRUCTIONS">KITCHENAID CLASSIC MIXER 5K45SS - ATTACHMENTS AND INSTRUCTIONS</a>]
【问题讨论】:
-
只有当
each.find("title_box")返回任何东西时,你的title变量才会被定义。这意味着在任何迭代中都找不到title_box。 -
each.find('title_box')是做什么的? -
啊,我明白了,我要做的是使用
('a', attrs={'class': 'vip'})从html中提取数据的每次迭代 -
将字符串传递给
find方法搜索名称与字符串匹配的标记。因此,当您调用each.find('title_box')时,您正在尝试查找title_box标记。你确定那是你想要的吗?如果是class属性的值,则应使用each.find(attrs={'class': 'title_box'})。 -
Mahesh 没错,我要找的是这个
if each.find('a', attrs={'class': 'vip'}),所以我的问题是:如何从循环和 if/else 语句中打印这些结果?
标签: python web-scraping beautifulsoup