【问题标题】:Webscraping in Python: strange order and scraping problemPython中的Web Scraping:奇怪的顺序和抓取问题
【发布时间】:2021-07-20 16:47:59
【问题描述】:

我正在做一些网络抓取,并且发生了一些非常奇怪的事情,我无法想出导致问题的原因,也无法找到解决方案......

我正在使用它来浏览链接列表,打开它们并保存在 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 平方米 |商业 100 m² -Vedi dettaglio 编号:1 公寓 110 平方米 |商业 142 m² -Vedi dettaglio 钢琴 terra, con accesso disabili 2 钢琴 1个车库/盒子 露台 小酒馆 339.000 欧元 编号:2 阳台 公寓 170 平方米 |商业 174 m² -Vedi dettaglio 小酒馆 钢琴大地,con ascensore

该格式可能难以阅读,抱歉,请注意,广告以“id: num”开头,并应以 € 的价格结尾...

如您所见,除了 1 个数据之外,第一个添加完全缺失。

最后它甚至变得更疯狂:

ID:109 阳台 编号:110 编号:111 编号:112 编号:113 编号:114 编号:115 阳台 编号:116 阳台

P.S:我注意到信息的顺序由于某种原因是错误的。它应该始终将 appartamento(公寓)作为第一个元素,但由于某种原因,它得到了错误的信息,例如 balconeterrazza

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

有用的链接:

Link to page with all ad links

Page in screenshot

网站的图片以及实际订单应该如何,而不是比真正的第一件商品更早获得东西......

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 嗨,感谢您的回答,但我试图了解我在代码中做错了什么。任何人,您的答案对于另一种解决此问题的方法都非常有用。你知道是什么导致我的代码出现这样的问题吗?
【解决方案2】:

我实际上是自己尝试不同的设置找到了解决方案,但仍然出现问题,所以我会将其添加到此答案中,并且不会将其标记为最终答案...

这非常愚蠢和容易,我只需要控制插入顺序,因为标题可能超过值,反之亦然。这个嵌套的 for 完成了这项工作。

问题仍然存在,重复数据,例如我将插入的第二张图像中的数据。

复制结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2021-12-25
    • 1970-01-01
    • 2019-09-06
    • 2019-05-22
    相关资源
    最近更新 更多