繁体   English   中英

AttributeError:'NoneType'对象没有属性'find_all'Beautifulsoup

[英]AttributeError: 'NoneType' object has no attribute 'find_all' Beautifulsoup

我正在尝试刮擦此链接的房屋价格: https : //www.leboncoin.fr/ventes_immobilieres/offres/ile_de_france/p-2/

而且我需要知道程序有什么问题吗?

我的程序:

import csv
import requests
from bs4 import BeautifulSoup

with open("bc.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["prix", "code_postal", "description", "nombre_pieces", "surface"]) 
    for i in range(1, 20):
        url = "https://www.leboncoin.fr/ventes_immobilieres/offres/ile_de_france/p-%s/" % i
        soup = BeautifulSoup(requests.get(url).text, "html.parser")
        repo = soup.find(class_="undefined")
        for repo in repo.find_all("li", attrs={"itemscope itemtype": "http://schema.org/Offer"}):
            prix = repo.find("span", {"itemprop": "priceCurrency"})
            prix = prix.text if prix else ""
            writer.writerow([prix])

我收到此错误:

Traceback (most recent call last):
File "nv.py", line 14, in <module>
for repo in repo.find_all("li", attrs={"itemscope itemtype": "http://schema.org/Offer"}):
AttributeError: 'NoneType' object has no attribute 'find_all'

JavaScript在这里呈现到页面。您可以同时使用硒和漂亮的汤来获取所需的输出。

from selenium import webdriver
from bs4 import BeautifulSoup
driver=webdriver.Chrome('path of the chrome driver')
driver.get("https://www.leboncoin.fr/ventes_immobilieres/offres/ile_de_france/p-2/")
soup=BeautifulSoup(driver.page_source,'html.parser')
repo = soup.find(class_="undefined")
for repo in repo.find_all("li", attrs={"itemtype": "http://schema.org/Offer"}):
    prix = repo.find("span", {"itemprop": "priceCurrency"})
    if prix.text!='':
       print(prix.text)

您正在尝试搜索requests返回的数据中不存在的内容。

当您检查requests.get(url).text ,您可能会看到类似于以下内容:

<!--
Need permission to access data? Contact: DataAccess@datadome.co
-->
<html><head><title>You have been blocked</title><style>#cmsg{animation: A 1.5s;}@keyframes A{0%{opacity:0;}99%{opacity:0;}100%{opacity:1;}}</style></head><body style="margin:0"><p id="cmsg">Please enable JS and disable any ad blocker</p><script>var dd={'cid':'AHrlqAAAAAMAptz12-9nkWQAJcs_Yg==','hsh':'05B30BD9055986BD2EE8F5A199D973','t':'fe'}</script><script src="https://ct.datadome.co/c.js"></script></body></html>

导致将None分配给变量repo结果是,解释器抱怨类型None对象的不存在的find_all()属性。

因此,基本上,您需要在开始处理数据之前确保拥有正确的数据。 正如KunduK在他的回答中所建议的那样 ,您可以使用SeleniumChromeDriver来获得数据而不会被阻塞。 您可以从http://chromedriver.chromium.org/获取ChromeDriver

硒的阻塞和使用已经涉及到。 我将展示一种以不错的json格式获取所有列表的方法,您可以在其中轻松提取信息。 如果您使用selenium进入每个页面,则可以使用regex提取页面上的所有列表信息,并传递给json.loads生成json对象, 例如此处 ,您可以轻松解析每个列表中的所有信息

from selenium import webdriver
import re
import json

p = re.compile(r'({"req.*).*[^\r\n]')
driver = webdriver.Chrome()
driver.get("https://www.leboncoin.fr/ventes_immobilieres/offres/ile_de_france/p-3/")
soup = bs(driver.page_source,'html.parser')
data = json.loads(p.findall(driver.page_source)[0])
listings = data['data']['ads']

for listing in listings:
    print(listing)

正则表达式说明:

在这里尝试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM