python - Python中的网页抓取:奇怪的顺序和抓取问题
问题描述
我正在做一些网络抓取,并且发生了一些非常奇怪的事情,我无法想出导致问题的原因,也无法找到解决方案......
我正在使用它来浏览链接列表,打开它们并将我要求的类标签中包含的所有值保存在 3 个列表中,这是代码:
for link in list_links:
soup = BeautifulSoup(requests.get(link).content, "html.parser")
for title in soup.find_all(class_="im-features__title"):
info_annunci_title.append(title.get_text(strip=True))
for value in soup.find_all(class_="im-features__value"):
info_annunci_value.append(value.get_text(strip=True))
for altro in soup.find_all(class_="im-features__tag"):
info_annunci_altro.append(altro.get_text(strip=True))
在此之后,我使用嵌套的 for 并行遍历 3 个压缩列表,以在前 3 个列表中搜索我实际需要保存的所有值。
代码:
for t, v, a in zip(info_annunci_title, info_annunci_value, info_annunci_altro):
# Crea oggetti JSON per ogni annuncio salvato
if "tipologia" in t:
list_annunci.append(v)
if "superficie" in t:
list_annunci.append(v)
if "piano" in t:
list_annunci.append(v)
if "piani edificio" in t:
list_annunci.append(v)
if "prezzo" in t:
list_annunci.append(v)
if "Auto" in t:
list_annunci.append(v)
if "Balcone" in a:
list_annunci.append(a)
if "Cantina" in a:
list_annunci.append(a)
if "Terrazza" in a:
list_annunci.append(a)
此时出现了一个奇怪的问题......除了第一个和最后几个广告之外,我正在查看的几乎所有广告都得到了很好的结果,这是输出:
id: 0 阳台公寓 95 m² | Commerciale 100 m² -Vedi dettaglio id: 1 Appartamento 110 m² | Commerciale 142 m² -Vedi dettaglio Piano terra, con accesso disabili 2 piani 1 ingarage/box Terrazza Cantina € 339.000 id: 2 Balcone Appartamento 170 m² | Commerciale 174 m² -Vedi dettaglio Cantina Piano terra, con ascensore
该格式可能难以阅读,抱歉,请注意,广告以“id: num”开头,并应以 € 的价格结尾...
如您所见,除了 1 个数据之外,第一个 add 完全丢失。
最后它甚至变得更疯狂:
id: 109 阳台 id: 110 id: 111 id: 112 id: 113 id: 114 id: 115 阳台 id: 116 阳台
PS:我注意到由于某种原因信息的顺序是错误的。它应该始终将appartamento(公寓)作为第一个元素,但由于某种原因,它得到了错误的信息,例如balcone或terrazza。
是什么造成了这个奇怪的错误,我该如何解决它/我哪里出错了?
有用的链接:
网站的图片以及实际订单应该如何,而不是比真正的第一个项目更早得到东西......
解决方案
要从广告中获取所有信息,您可以使用下一个示例:
import requests
import pandas as pd
from bs4 import BeautifulSoup
def get_info(ad_url):
out = {}
soup = BeautifulSoup(requests.get(ad_url).content, "html.parser")
for t, v in zip(
soup.select(".im-features__title"), soup.select(".im-features__value")
):
tags = v.select(".im-features__tag")
if tags:
for tag in tags:
out[tag.get_text(strip=True)] = "X"
else:
out[t.get_text(strip=True, separator=" ")] = v.get_text(strip=True)
return out
url = "https://www.immobiliare.it/vendita-case/ancona/borgo-rodi/?criterio=rilevanza"
soup = BeautifulSoup(requests.get(url).content, "lxml")
out = []
for li in soup.select('li[id^="link_ad_"]'):
link = li.a
print(link["href"])
out.append({"Name": link.get_text(strip=True), "URL": link["href"]})
out[-1].update(get_info(link["href"]))
df = pd.DataFrame(out)
print(df)
df.to_csv("data.csv", index=None)
创建data.csv
(来自 LibreOffice 的屏幕截图):
推荐阅读
- ios - 如何解决 iOS 上失败的 Flutter 应用构建失败?
- linear-algebra - Spark AR 对象旋转
- java - API连接突然不再通过应用程序工作
- java - 使用 java 驱动程序处理 MongoDB 中模式更改的正确方法
- linux - 从txt文件中提取文本
- c++ - 是否可以在没有动态多态性的情况下在 C++ 中实现状态设计模式?
- python - 在 JSON 对象中附加列表
- python - 使用 PySimpleGUI 为 AWS Lambda、AWS IoT 和 python 创建工作流工具
- .net - 将 API 帖子正文创建为 Stream .net
- svg - 是什么让第二个 svg 比第一个更小?