這是我的代碼:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import pandas as pd
driver = webdriver.Chrome(service=Service(executable_path=ChromeDriverManager().install()))
driver.maximize_window()
driver.get('https://quotes.toscrape.com/')
df = pd.DataFrame(
{
'Quote': [''],
'Author': [''],
'Tags': [''],
}
)
quotes = driver.find_elements(By.CSS_SELECTOR, '.quote')
for quote in quotes:
text = quote.find_element(By.CSS_SELECTOR, '.text')
author = quote.find_element(By.CSS_SELECTOR, '.author')
tags = quote.find_elements(By.CSS_SELECTOR, '.tag')
for tag in tags:
quote_tag = tag
df = df.append(
{
'Quote': text.text,
'Author': author.text,
'Tags': quote_tag.text,
},
ignore_index = True
)
df.to_csv('C:/Users/Jay/Downloads/Python/!Learn/practice/scraping/selenium/quotes.csv', index=False)
我應該得到這個結果:
| 參考 | 作者 | 標簽 |
|---|---|---|
| “我們創造的世界是我們思考的程序。如果不改變我們的想法,它就無法改變。” | 艾爾伯特愛因斯坦 | 改變深思思維世界 |
相反,我得到了這個:
| 參考 | 作者 | 標簽 |
|---|---|---|
| “我們創造的世界是我們思考的程序。如果不改變我們的想法,它就無法改變。” | 艾爾伯特愛因斯坦 | 世界 |
我只得到Tags列中的最后一項,而不是所有四項。
如果我運行:
quotes = driver.find_elements(By.CSS_SELECTOR, '.quote')
for quote in quotes:
tags = quote.find_elements(By.CSS_SELECTOR, '.tag')
for tag in tags:
quote_tag = tag
print(quote_tag.text)
我得到:
change
deep-thoughts
thinking
world
etc
所以這段代碼有效。
為什么沒有Tags正確填充該列?
uj5u.com熱心網友回復:
對于您的回圈,請使用以下代碼:
quote_tags = []
for tag in tags:
quote_tags.append(tag.text)
df = df.append(
{
'Quote': text.text,
'Author': author.text,
'Tags': ' '.join(quote_tags),
},
ignore_index = True
)
如果您注意到,添加的唯一標簽 ( world) 恰好是最后一個標簽……這并非巧合。這是因為您遍歷標簽,并且對于每個標簽,您將該標簽分配給quote_tag變數,但您不對其進行任何操作,因此下一次回圈迭代只會覆寫上一次迭代設定的值。最后,當回圈結束時,quote_tag具有最后一個標簽的值。
uj5u.com熱心網友回復:
用你的代碼
for tag in tags:
quote_tag = tag
更換quote_tag用tag在for回圈的每次運行,從而覆寫存盤在以前的值quote_tag。因此,在最后一次運行之后,quote_tag只包含最后一個標簽。
你需要做類似的事情
quote_tag = ''
for tag in tags:
quote_tag = ' ' tag
如果要將所有標簽連接在一起。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361648.html
