首页 > 解决方案 > 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(公寓)作为第一个元素,但由于某种原因,它得到了错误的信息,例如balconeterrazza

是什么造成了这个奇怪的错误,我该如何解决它/我哪里出错了?

有用的链接:

链接到包含所有广告链接的页面

屏幕截图中的页面

网站的图片以及实际订单应该如何,而不是比真正的第一个项目更早得到东西......

我正在抓取的广告部分的图片

标签: pythonpython-3.xweb-scraping

解决方案


要从广告中获取所有信息,您可以使用下一个示例:

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 的屏幕截图):

在此处输入图像描述


推荐阅读