我正在抓取一个网站,以便将数据存储在具有 3 列的数据库中。我正在抓取的网站部分看起来像下面三个示例之一
# Example 1:
<div>
<a href="sample1">text1</a>
</div>
# Example 2:
<div>
<a href="sample1">text1</a>
<a href="sample2">text2</a>
</div>
# Example 3:
<div>
<a href="sample1">text1</a>
<a href="sample2">text2</a>
<a href="sample3">text3</a>
</div>
我正在尝试分配
- “text1”到 var1,
- 空字符串或“text2”到 var2,
- 空字符串或“text3”到 var3。
执行此操作的最佳方法是什么?
我试过的一些东西是
### FIRST ATTEMPT
var1, var2, var3 = '','',''
# could also do var1, var2, var3 = ('',)*3
all = soup.find_all('a')
var1 = all[0].text
try:
var2 = all[1].text
except:
pass
try:
var3 = all[3].text
except:
pass
#### SECOND ATTEMPT
all = [s.text for s in soup.find_all('a')]
# This is where i get stuck... This could return a list of length 1, 2, or 3, and I need the output to be a list of length 3 so i can use the following line to assign variables
var1, var2, var3 = all
#### THIRD ATTEMPT
all = [s.text for s in soup.find_all('a')]
var1, var2, var3 = '','',''
n = len(all)
var1 = all[0].text
if n = 2:
var2 = all[1].text
else:
var2 = all[1].text
var3 = all[2].text
编辑: 我试图在我的数据库中包含三个字段的原因是因为我希望能够按这些不同的变量中的每一个进行过滤。 var1 是最准确的标签,var2 稍微准确一些,var3 的准确度很高。把它想象成衣服……var1 可以是灰色休闲裤,var2 可以是商务休闲裤,var3 可以是裤子。
请您参考如下方法:
您的第二次尝试可能更像 pythonic。当然,您事先并不知道 .find_all 的结果是否是一个长度 ==3(或更多,或更少)的列表。因此,您应该使用 try/except 或其他逻辑来控制将结果写入数据库的方式/时间。
# create a dictionary of your database column names:
dbColumns = {0:'column1', 1:'column2', 2:'column3'}
# get all the results; there might be 0 or 3 or any number really,
# we'll deal with that later
results = [s.text if s.text else "" for s in soup.find_all('a')]
# iterate the items in the list, and put in corresponding DB
for col in range(len(results)):
# use the dbColumns dict to insert to the desired column
query = "Insert INTO [db_name].[" + dbColumns[col] + "]"
query += "VALUES '" + results[i] + '"
"""
db.insert(query) # assumes a db object that has an "insert" function; modify as needed
"""
这种方法的要点是,这个问题似乎没有什么技术上需要硬编码恰好三个对象(var1、var2、var3)并尝试分配给这些对象。相反,只需返回 find_all 的结果并按结果列表中的索引处理它们。
