Python - 有没有办法简化网络抓取代码?

Python - is there a way to simplify the web scraping code?

正在尝试通过网络抓取 属性 列表并进入以下阶段:

import bs4
from urllib.request import urlopen as Open
from urllib.request import Request
from bs4 import BeautifulSoup as soup

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3"}
my_url = "https://www.otodom.pl/oferta/narozne-2-pokoje-nowa-inwestycja-0-ID43FH9.html"
req = Request(url=my_url, headers=headers) 
html = Open(req).read() 

# get property features

container = page_soup.find("section", {"class":"section-overview"}).findNext("div").ul.findAll("li")

for contain in container:

    if "Rynek" in contain.text:
        rynek = contain.text.split(":")[1]
        break
    else:
        rynek = "N/A"

for contain in container:        
    if "Materiał budynku" in contain.text:
        material_budynku = contain.text.split(":")[1]
        break
    else:
        material_budynku = "N/A"

print(
rynek,
material_budynku,
        )

每个房源都有一些列出的特征,总共有 40 多个独特的特征。在上面的代码中,我刚刚陈述了两个示例,一个是现有功能,一个是缺失的。

网络抓取的最终目标是遍历所有功能的列表,并检查它们是否存在。如果是 - 取特征变量,如果不是 - 放一个通用的 "N/A".

我可能只做以下 40 多次迭代...

for contain in container:        
    if "Materiał budynku" in contain.text:
        material_budynku = contain.text.split(":")[1]
        break
    else:
        material_budynku = "N/A"

...但是我想知道有没有更简洁的方法?

这个怎么样?

features = []
for feature in ["Rynek", "Materiał budynku"]:
    for contain in container:
        if feature in contain.text:
            features.append(contain.text.split(":")[1])
            break
    else:  # if we didn't break
        features.append("N/A")

print(*features)

我们不是一一列出功能,而是简单地迭代它们。我们要做的唯一有点奇怪的事情是使用鲜为人知的 else for 循环分支,我们可以用它来测试我们是否找到了一个特征。