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 循环分支,我们可以用它来测试我们是否找到了一个特征。
正在尝试通过网络抓取 属性 列表并进入以下阶段:
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 循环分支,我们可以用它来测试我们是否找到了一个特征。