Не удалось получить значение атрибута в Python - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь закодировать скребок для веб-сайта, и до сих пор мне удавалось собрать общую информацию, которая мне нужна, но конкретное значение атрибута, которое я пытаюсь получить из этой информации, не возвращает ни одного, даже если есть явные значениятам.Все работает нормально, пока я не попытаюсь использовать getattr каждого контейнера в контейнерах, чтобы найти значения для data-id.Возможно, есть лучший способ сделать это, но мне трудно понять, почему он не может его найти.

Вот как выглядит мой код.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.action_chains import ActionChains

url = "http://csgo.exchange/id/76561197999004010#x"

driver = webdriver.Firefox()

driver.get(url)
import time
time.sleep(10)
html = driver.page_source
soup = soup(html, "html.parser")


containers = soup.findAll("div",{"class":"vItem"})
print(len(containers))

for container in containers:
    test = getattr(container, "data-id")

    print(str(test))


with open('scraped.txt', 'w', encoding="utf-8") as file:
    file.write(str(containers))

Вотпример того, как выглядит каждый контейнер.

div class = "vItem Normal Container cItem" data-bestquality = "0" data-category = "Normal" data-collection = "The Spectrum Collection" data-currency = "0" data-custom = "" data-external = "" data-hashname = "Spectrum% 20Case" data-id = "15631554103"

1 Ответ

0 голосов
/ 08 марта 2019

Просто измените строку с getattr() на container.attrs["data-id"]. Это подходит для меня. Но 10 секундных снов мне было недостаточно в большинстве попыток.

from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.action_chains import ActionChains

url = "http://csgo.exchange/id/76561197999004010#x"

driver = webdriver.Firefox()

driver.get(url)
import time
time.sleep(10)
html = driver.page_source
soup = soup(html, "html.parser")


containers = soup.findAll("div",{"class":"vItem"})
print(len(containers))
data_ids = [] # Make a list to hold the data-id's

for container in containers:
    test = container.attrs["data-id"]
    data_ids.append(test) # add data-id to the list

    print(str(test))


with open('scraped.txt', 'w', encoding="utf-8") as file:
    for id in data_ids:
        file.write(str(id)+'\n') # write every data-id to a new line. 
...