Beautifulsoup使用多次选择



我的问题与此答案有关。

我有以下代码:

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)

获得所需的HTML

您可以加入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()        

最新更新