[ad_1]
これは私がこれまでに持っているコードです:
from grp import struct_group
from bs4 import BeautifulSoup
import requests
import pandas as pd
import urllib.parse
name = []
price = []
mileage = []
dealer_name =[]
source = []
for i in range (1,13):
#Allow to Crawl multiple pages:
website="https://www.cars.com/shopping/results/?page=" + str(i) + '&page_size=20&dealer_id=&keyword=&list_price_max=&list_price_min=&makes[]=&maximum_distance=all&mileage_max=&sort=best_match_desc&stock_type=used&year_max=&year_min=&zip=95355'
#Requesting using requests lib
response = requests.get(website)
soup = BeautifulSoup(response.content, 'html.parser')
#Finding results
results = soup.find_all('div', {'class':'vehicle-card'})
url_combine = []
root_url="http://www.cars.com"
url_combine = root_url , source
for result in results:
# name
try:
name.append(result.find('h2').get_text())
except:
name.append('n/a')
#price
try:
price.append(result.find('span', {'class':'primary-price'}).get_text())
except:
price.append('n/a')
# mileage
try:
mileage.append(result.find('div', {'class':'mileage'}).get_text())
except:
mileage.append('n/a')
# dealer_name
try:
dealer_name.append(result.find('div', {'class':'dealer-name'}).get_text().strip())
except:
dealer_name.append('n/a')
#link
try:
source.append(result.find('a', {'class':'vehicle-card-visited-tracking-link'}).get('href'))
except:
source.append('n/a')
for link in source:
url_combine.append(urllib.parse.urljoin(root_url, link))
#Using Pandas to create a dictionary and import to Excel
car_listings = pd.DataFrame({'Name': name, 'Mileage':mileage, 'Price': price, 'Dealer Name':dealer_name,'Link': source})
car_listings.to_excel('car_listings_page4.xlsx')
しかし、私はそれが言うところで問題に遭遇し続けます AttributeError: 'tuple' object has no attribute 'append'
.
私はすべてを作る必要があることを知っています list
の代わりに tuple
しかし、自分の間違いがどこにあるかを見つけることができないようです。 これは完全なURLを取得する1つの方法だと思います href
. もしそうなら、コードに実装できる他の方法はありますか?
新しい寄稿者
2
これらをすべて避ける lists
と使用 dicts
代わりに、より構造化された方法で情報を簡素化して保存します-使用することもできます if-statement
.
文字列連結を実行するには、さまざまな方法があります。
+
オペレーターjoin()
方法%
オペレーターformat()
関数f-string
リテラル文字列補間 (への割り当ての例を確認してください)website
)
ただし、最も単純なものは使用しています +
オペレーター:
root_url+link
私の例について dicts
次のようになります。
'link': root_url+result.find('a', {'class':'vehicle-card-visited-tracking-link'}).get('href') if result.find('a', {'class':'vehicle-card-visited-tracking-link'}) else None
または少し短く walrus operator
(Python 3.8 以降):
'link': root_url+a.get('href') if (a:=result.find('a', {'class':'vehicle-card-visited-tracking-link'})) else None
例
from bs4 import BeautifulSoup
import requests
import pandas as pd
root_url="http://www.cars.com"
data = []
for i in range (1,2):
website =f'https://www.cars.com/shopping/results/?page={i}&page_size=20&dealer_id=&keyword=&list_price_max=&list_price_min=&makes[]=&maximum_distance=all&mileage_max=&sort=best_match_desc&stock_type=used&year_max=&year_min=&zip=95355'
response = requests.get(website)
soup = BeautifulSoup(response.content, 'html.parser')
results = soup.find_all('div', {'class':'vehicle-card'})
for result in results:
data.append({
'name': result.find('h2').get_text() if result.find('h2') else None,
'price': result.find('span', {'class':'primary-price'}).get_text() if result.find('span', {'class':'primary-price'}) else None,
'link': root_url+a.get('href') if (a:=result.find('a', {'class':'vehicle-card-visited-tracking-link'})) else None
### all the other info
})
pd.DataFrame(data)
出力
名前 | 価格 | リンク | |
---|---|---|---|
0 | 2017 レクサス IS 200t ベース | $28,900 | http://www.cars.com/vehicledetail/6942c51b-c26c-4614-97f1-acb0b7517b82/ |
1 | 2021 リンカーン コルセア リザーブ | $43,797 | http://www.cars.com/vehicledetail/e575219a-90fa-4a95-ade5-d2740e746cd0/ |
2 | 2021 ヒュンダイ IONIQ ハイブリッド SE | $26,997 | http://www.cars.com/vehicledetail/716b65ec-3abd-42e4-b19b-9024d2ad58f1/ |
3 | 2021 GMC ユーコン XL デナリ | $74,888 | http://www.cars.com/vehicledetail/475045f6-142a-440f-80e7-2c3ae289fee2/ |
4 | 2007 シボレー シルバラード 1500 | $12,688 | http://www.cars.com/vehicledetail/56080319-0bb9-49e0-8758-24f58d0d5d76/ |
…
0
あなたが探している答えではありませんか? タグ付けされた他の質問を閲覧する python-3.x ウェブスクレイピング 美しいスープ 連結 また 自分の質問をする.
[ad_2]
Source link
url_combine = root_url , source
– それはタプルです。その行を削除または編集して、url_combine.append(urllib.parse.urljoin(root_url, link))
エラーを出さない– シッシー6789
2日前
問題を見つけやすくするために、コードを修正してください。 次のガイドラインに従って、 最小限の再現可能な例.
– コミュニティ
ボット
2日前
| |