![](/img/trans.png)
[英]AttributeError: 'NoneType' object has no attribute 'find_all' (BeautifulSoup) (ChromeDriver)
[英]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在他的回答中所建议的那样 ,您可以使用Selenium和ChromeDriver来获得数据而不会被阻塞。 您可以从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.