Python-有没有一种方法可以简化网络抓取代码?

时间:2019-11-28 15:12:09

标签: python-3.x web-scraping simplify

试图通过网络搜集一个房地产清单,并进入以下阶段:

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多个独特功能。在上面的代码中,我只说了两个示例,一个是当前功能,另一个是缺失。

最终目标是使网络抓取功能浏览所有功能的列表,并检查它们是否存在。如果是,则使用-feature变量;否则,则使用通用的“ 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"

...但是我想知道是否有更整洁的方式?

1 个答案:

答案 0 :(得分:1)

怎么样?

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)

我们没有逐一列出功能,而是简单地遍历它们。我们要做的唯一有点奇怪的事情就是使用鲜为人知的for循环else分支,通过它可以测试我们是否发现了一个功能。