我的问题与此答案有关。
我有以下代码:
import urllib.request
from bs4 import BeautifulSoup
time = 0
html = urllib.request.urlopen("https://www.kramerav.com/de/Product/VM-2N").read()
html2 = urllib.request.urlopen("https://www.kramerav.com/de/Product/SDIA-IN2-F16").read()
try:
div = str(BeautifulSoup(html).select("div.large-image")[0])
if(str(BeautifulSoup(html).select("div.large-image")[1]) != ""):
div += str(BeautifulSoup(html).select("div.large-image")[1])
time = time + 1
except IndexError:
div = ""
time = time + 1
finally:
print(str(time) + div)
变量HTML的位点具有2个名为"大图像"的Div-classes。变量HTML2的位点只有1个。使用HTML,该程序按预期工作。但是,如果我切换到HTML2,则变量DIV将完全为空。
我想保存1个级别,而不是什么都不保存。我怎么能拱起这个?
变量div将完全为空。
那是因为您的错误处理程序将其分配为空字符串。
请不要以这种方式使用下标,条件和处理程序。使用for
迭代select(),构建结果列表(或字符串)。
另外,您应该仅创建一次soup = BeautifulSoup(html)
,因为这可能是一个相当昂贵的操作,因为它仔细地解析了潜在的长途网页。因此,您可以使用以下方式建立HTML片段列表。
images = [image
for image in soup.select('div.large-image')]
或出于某种原因您不喜欢列表的理解,您可以等效地写:
images = []
for image in soup.select('div.large-image'):
images.append(image)
,然后使用div = 'n'.join(images)
。
您可以加入for
循环中的所有项目
all_divs = soup.select("div.large-image")
for item in all_divs:
div += str(item)
time += 1
或使用join()
time = len(all_divs)
div = ''.join(str(item) for item in all_divs)
您还可以直接在for
循环中写入文件,然后进入行
for item in all_divs:
csv_writer.writerow( [str(item).strip()] )
time += 1
工作示例
import urllib.request
from bs4 import BeautifulSoup
import csv
div = ""
time = 0
f = open('output.csv', 'w')
csv_writer = csv.writer(f)
all_urls = [
"https://www.kramerav.com/de/Product/VM-2N",
"https://www.kramerav.com/de/Product/SDIA-IN2-F16",
]
for url in all_urls:
print('url:', url)
html = urllib.request.urlopen(url).read()
try:
soup = BeautifulSoup(html)
all_divs = soup.select("div.large-image")
for item in all_divs:
div += str(item)
time += 1
# or
time = len(all_divs)
div = ''.join(str(item) for item in all_divs)
# or
for item in all_divs:
#div += str(item)
#time += 1
csv_writer.writerow( [time, str(item).strip()] )
except IndexError as ex:
print('Error:', ex)
time += 1
finally:
print(time, div)
f.close()