Python Webscraping Probleme mit der Tag Anwahl

Rizzo

Cadet 4th Year
Registriert
Apr. 2008
Beiträge
123
OK kryptische Überschrift kurz erklärt: Lerne gerade Basiswissen zum Webscraping mit Beautifulsoup sowie Requests. Tue mich allerdings schwer damit den Inhalt eines "p" Tags auszulesen wenn mehrere hintereinandergeschaltet sind auf gleicher Ebene ohne spezifischer Bezeichnung.

Möchte den Titel , die Produktbeschreibung sowie den Preis auslesen pro Tuch.

Die url: https://www.madeinpalestine.de/deutsch/palästina-tücher/

So sieht das dann dort aus:
HTML:
<p style="text-align: right;"></p>
<p style="text-align: right;"></p>
<p style="text-align: right;"><span style="line-height: 19.6px; text-align: left;"></span></p>
<p>
     Das klassische Schwarz-weiße Tuch, wie von Arafat getragen wurde. 
</p>


Hier meine "Lösung":
Code:
import requests as req
from bs4 import BeautifulSoup as soup 

my_url = 'https://www.madeinpalestine.de/deutsch/palästina-tücher/'

page_html = req.get(my_url)

page_soup = soup(page_html.content, "lxml")

containers = page_soup.findAll("div", {"class": "cc-shop-product-desc"})

for container in containers:
	try:
		name = container.h4.text
		print(name)
	except:
		pass

	try:
		product_container = container.findAll("div", {"class": "description"})
		product_desc = product_container[0].text.strip()
		print(product_desc)
	except:
		pass

	try:
		preis_container = container.findAll("p", {"itemprop": "price"})
		preis = preis_container[0].text.strip()
		print(preis)
		print("\n")
	except:
		pass

Die Seite definiert die Produktbeschreibung manchmal im ersten, zweiten und manchmal im dritten "p" Tag. Die anderen sind dann leer und erzeugen Leerzeilen daher meine Fragen:
Frage 1: Wie spreche ich direkt nur das 3. "p" Tag an?
Frage 2: Wie spreche ich alle "p" Tags an und verbinde die Textpassagen lasse aber die ganzen leeren "p" Leerzeilen aus bzw formatiere diese automatisch weg?

Vielen Dank für eure Hilfe

Rizzo
 
Ohne jetzt irgendwas über Python oder Soup zu wissen.

Code:
preis_container = container.findAll("p", {"itemprop": "price"})
combined = ""

for element in preis_container:
    combined += element.text.strip()

Bei den Einträgen die leer sind sollte im Resultat nichts mehr auftauchen da strip() alles entfernt, nehm ich an.
 
Hey, das mit dem Preis funktioniert ja schon es geht halt nur um den Teil mit dem "p" Tag und leider wird da nix wirklich gestripped.
 
Hey, danke für den Link. Muss ich mich in Ruhe mit beschäftigen.. hatte gehofft es gäbe eine einfachere Lösung.
 
Rizzo schrieb:
Frage 2: Wie spreche ich alle "p" Tags an und verbinde die Textpassagen lasse aber die ganzen leeren "p" Leerzeilen aus bzw formatiere diese automatisch weg?

Code:
for product in product_container:
    text = ' '.join([para.text.strip() for para in product.findAll('p') if para.text.strip()])
 
@soares Wow danke dir! Das hat das Problem Nr.2 gelöst! Sehr smooth :-)
 

Ähnliche Themen

Zurück
Oben