Problem med webscraping, alla "li-taggar" dyker inte upp [python]

Permalänk

Problem med webscraping, alla "li-taggar" dyker inte upp [python]

from bs4 import BeautifulSoup as soup from urllib.request import Request, urlopen page_url = "https://www.inet.se/kategori/164/grafikkort-gpu" req = Request(page_url, headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read() soup_page = soup(webpage, "html.parser") products = soup_page.find("div", {"class": "product-list product-list-size-default"}).find_all("li") for product in products: print(product.text)

Vid körning av koden dyker inte alla "li-taggar" (grafikkort) upp som finns på inet. Någon som vet varför och hur jag kan lösa detta?

Permalänk

Jag tror du behöver leta reda på <ul> elementet först. Följande selector fungerade i min webbläsare för att hitta samtliga element för grafikkorten:
document.querySelectorAll("div.product-list.product-list-size-default > ul > li")

Obs! Den hittar bara de 51 st som visas på sidan. Den kommer inte trycka på "Visa alla" åt dig, som sen laddar in grafikkorten steg för steg medan du scrollar.

Permalänk
Skrivet av fsmedberg:

Jag tror du behöver leta reda på <ul> elementet först. Följande selector fungerade i min webbläsare för att hitta samtliga element för grafikkorten:
document.querySelectorAll("div.product-list.product-list-size-default > ul > li")

Obs! Den hittar bara de 51 st som visas på sidan. Den kommer inte trycka på "Visa alla" åt dig, som sen laddar in grafikkorten steg för steg medan du scrollar.

from bs4 import BeautifulSoup as soup from urllib.request import Request, urlopen page_url = "https://www.inet.se/kategori/164/grafikkort-gpu" req = Request(page_url, headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read() soup_page = soup(webpage, "html.parser") products = soup_page.find("div", {"class": "product-list product-list-size-default"}).ul.find_all("li") for product in products: print(product.text)

Du menar att jag ska skriva så här istället?
Fungerar fortfarande inte

Permalänk
Medlem
Skrivet av currymage:

from bs4 import BeautifulSoup as soup from urllib.request import Request, urlopen page_url = "https://www.inet.se/kategori/164/grafikkort-gpu" req = Request(page_url, headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read() soup_page = soup(webpage, "html.parser") products = soup_page.find("div", {"class": "product-list product-list-size-default"}).ul.find_all("li") for product in products: print(product.text)

Du menar att jag ska skriva så här istället?
Fungerar fortfarande inte

Datan du vill ha finns inte i dokumentet utan hämtas i efterhand, så du får ta och angripa API:t direkt istället. Drog ihop något snabbt och fragilt du kan bli inspirerad av. Finns finare metoder än regex för att släpa ut idn ur dokumentet och kanske kan man få det direkt från API:t också. Svårt att veta när man inte sitter på dokumentationen.

import requests import re s = requests.Session() r = s.get("https://www.inet.se/kategori/164/grafikkort-gpu") ids = re.search('productIds":(\[[^\]]*])', r.text)[1] r = s.post("https://www.inet.se/api/products", data=ids, headers={"content-type": "application/json"}) for product in r.json().values(): print(product["name"])

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk

Testa selenium, det hjälper mig väldigt mycket i webscrapingen.

Permalänk
Medlem

Jag har precis samma problem själv, tänkte hålla koll på lite priser på böcker från Adlibris, men dom skickar inte heller ut priset i html-dokumentet direkt. Finns det något generellt enkelt verktyg som kan användas för att plocka hem data för specifika sidor efter att DOM laddat klart, eller måste man försöka luska ut deras api?