Python få ut string ur html-kod från URL

Permalänk
Medlem

Python få ut string ur html-kod från URL

Tjenna!

Jag använder mig av BeautifulSoup tillsammans med python för att hämta ut information ur en del webbsidor (en scraper helt enkelt).

Jag har fått allt att lira tillsammans med element, typ divs och liknande.

Typ

title = soup.find("meta", property="og:description")

Men säg att det finns en text på hemsidan som ligger i någon <p> men utan något id, men alltid är samma text.

Typ:

Today temprature: 10 degrees

Jag har test med text = soup.find_all , men den verkar inte vilja hämta datan ändå.

Om jag vill nå den strängen, kan man då använda sig av soup eller är det någon annan form av plugin jag behöver?

Någon som har något förslag?

Visa signatur

[ -- Gaming -- ]
{ i5-9600k - RTX 3070 OC - 16GB - 3 x 1TB m.2 }
[ -- Workstation --]
{ i7-5960X | GTX 1660 6GB / Quadro | 48GB corsair dominator platinum | 20TB }
{ Lenovo T480S | i7-8650U | 16 GB | 512 GB }

Permalänk
Inaktiv

Du skulle kunna köra en enkel regex om det alltid är samma. Till exempel: /Today temperature:\ (.*?)\ degrees/gm

Skickades från m.sweclockers.com

Permalänk
Medlem

Du kan använda CSS-selektorer och identifiera elementet utifrån dess föräldrar (som i något led lär ha unika klasser och ID:n). Ex:

temperature = soup.select_one("#weatherpanel .temperature>p")

Visa signatur

Spela Swemantle! Du vet att du vill.

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

Permalänk
Medlem
Skrivet av LemonIllusion:

Du kan använda CSS-selektorer och identifiera elementet utifrån dess föräldrar (som i något led lär ha unika klasser och ID:n). Ex:

temperature = soup.select_one("#weatherpanel .temperature>p")

Så det blir typ då:

<div id="weatherpanel"> <div class="container"> <p>Temprature is 10 degrees</p> </div> </div>

Detta skulle då gå att nå med den kod du skrev?

Visa signatur

[ -- Gaming -- ]
{ i5-9600k - RTX 3070 OC - 16GB - 3 x 1TB m.2 }
[ -- Workstation --]
{ i7-5960X | GTX 1660 6GB / Quadro | 48GB corsair dominator platinum | 20TB }
{ Lenovo T480S | i7-8650U | 16 GB | 512 GB }

Permalänk
Medlem
Skrivet av mrCatfood:

Så det blir typ då:

<div id="weatherpanel"> <div class="container"> <p>Temprature is 10 degrees</p> </div> </div>

Detta skulle då gå att nå med den kod du skrev?

Det jag skrev skulle fungera på detta:

<div id="weatherpanel"> <godtyckligt antal taggar i taggar> <div class="temperature"> <p>Temprature is 10 degrees</p> </div> </godtyckligt antal taggar i taggar> </div>

Dvs en p-tagg vars direkta förälder (>) är en tagg med temperature-klassen som i sin tur har elementet med id weatherpanel som förälder i något led, alltså inte nödvändigtvis som direkt förälder.

Berätta vilken hemsida du scrapar så kan du få bättre hjälp.

Visa signatur

Spela Swemantle! Du vet att du vill.

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

Permalänk
Medlem
Skrivet av LemonIllusion:

Det jag skrev skulle fungera på detta:

<div id="weatherpanel"> <godtyckligt antal taggar i taggar> <div class="temperature"> <p>Temprature is 10 degrees</p> </div> </godtyckligt antal taggar i taggar> </div>

Dvs en p-tagg vars direkta förälder (>) är en tagg med temperature-klassen som i sin tur har elementet med id weatherpanel som förälder i något led, alltså inte nödvändigtvis som direkt förälder.

Berätta vilken hemsida du scrapar så kan du få bättre hjälp.

Det är ingen specifik sida jag vill scrapa, utan det är ett script där du skriver in sidan och sedan anger vilket element du vill nå, för att sen kunna köra ett cronjob på det.

Men säg att det ser ut såhär:

<div id="weatherpanel"> <div class="temperature"> <p>Temprature is 10 degrees</p> <p>Hello2</p> <p>Hello3</p> </div> </div>

Om jag vill nå Hello2 och Hello3 är det åt samma håll då som det du skrev innan?

Försökte läsa mig fram i dokumentationen men finns inget som återskapar problemet, eller måste alla delar ha ett id eller en class?

Kan slänga med scriptet jag kör

# include standard modules import requests import argparse import mysql.connector from bs4 import BeautifulSoup # database settings mydb = mysql.connector.connect( host="", user="", passwd="", database="" ) # initiate the parser parser = argparse.ArgumentParser() # add long and short argument parser.add_argument("--web", "-w", help="Set the webpage") parser.add_argument("--element", "-e", help="Set the element") #parser.add_argument("--type", "-e", help="ID / CLASS") # read arguments from the command line args = parser.parse_args() # run script if args.web and args.element: print("Webpage set to %s" % args.web) print("Element set to %s" % args.element) URL = args.web page = requests.get(URL) soup = BeautifulSoup(page.content, 'html.parser') #temperature = soup.select_one("#weatherpanel .temperature>p") temperature = soup.select_one(args.element) print(temperature) mycursor = mydb.cursor() sql = "INSERT INTO scraper (url, temp) VALUES (%s, %s)" val = (URL, temperature) mycursor.execute(sql, val) mydb.commit() print("Temp added in mySQL Database") #Todo: #Add element to get with class-names and id's

Visa signatur

[ -- Gaming -- ]
{ i5-9600k - RTX 3070 OC - 16GB - 3 x 1TB m.2 }
[ -- Workstation --]
{ i7-5960X | GTX 1660 6GB / Quadro | 48GB corsair dominator platinum | 20TB }
{ Lenovo T480S | i7-8650U | 16 GB | 512 GB }

Permalänk
Medlem
Skrivet av mrCatfood:

Det är ingen specifik sida jag vill scrapa, utan det är ett script där du skriver in sidan och sedan anger vilket element du vill nå, för att sen kunna köra ett cronjob på det.

Men säg att det ser ut såhär:

<div id="weatherpanel"> <div class="temperature"> <p>Temprature is 10 degrees</p> <p>Hello2</p> <p>Hello3</p> </div> </div>

Om jag vill nå Hello2 och Hello3 är det åt samma håll då som det du skrev innan?

Försökte läsa mig fram i dokumentationen men finns inget som återskapar problemet, eller måste alla delar ha ett id eller en class?

För sådana lägen finns det pseudo-klasser som hjälper dig. Du kan plocka ut Hello2 med p:nth-child(2). (ex)
https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child
https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child
https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child

Här har du nog den bästa dokumentationen av CSS-selektorer: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selector...

Visa signatur

Spela Swemantle! Du vet att du vill.

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