Extracting lat/long from a BeautifulSoup object in python - python

I just started working with python's BeautifulSoup package for scraping. In my code I get the following soup object
>>> soupObj
[u'$(function(){SEAT.PG.initDialog(".generate-popup-3030",[{msez:"3030",c:"#333",o:0.5,f:false,html:SEAT.PG.getImgPopHtml}]);SEAT.PG.mappaInterattiva({longitude:13.37489,latitude:42.36009,sito:"pgol",zoomLevel:"1",lng:1,mirino:"http://img.pgol.it/pgol/img/mk_pallino.png",allowFoto:true,mapType:null,streetView:false,dr:false,addMobile:false,ums:"sorellenurzia"});var a=SEAT.commenti({__2011_commento_click_stella:"Clicca su una stella per dare il tuo voto",__2011_commento_da_evitare:"Da evitare",__2011_commento_di_meglio:"C\'\xe8 di meglio",__2011_commento_non_male:"Non male",__2011_commento_mi_piace:"Mi piace",__2011_commento_consigliato:"Consigliato",__2011_commento_scrivi:"Scrivi una recensione per condividere la tua esperienza con gli altri utenti",__2011_commento_breve:"Scrivi almeno 120 caratteri per dare informazioni utili e complete a chi legger\xe0 la recensione.",__2011_commento_manca_voto:"Ti sei dimenticato di dare un voto",__2011_commento_servizio_non_disponibile:"Il servizio al momento non \xe8 disponibile",__2011_commento_segnala:"Segnala la recensione",__2011_commento_segnala_msg1:"Ritieni che questa recensione sia offensiva o inappropriata a PagineGialle.it?",__2011_commento_segnala_msg2:"La nostra redazione si occuper\xe0 di controllarne il contenuto e, se necessario, di rimuoverlo dal sito",__2011_conferma:"conferma",__2011_annulla:"annulla",__2011_ha_scritto_il:"ha scritto il",__2011_pubblica:"pubblica",__2011_commento_modifica_recensione:"Modifica recensione",__2011_conferma_notifica:"Aggiornamento via email attivo",__2012_commenti_relatedopec:"Conosci anche queste attivit\xe0?",__2011_elimina_notifica:"Aggiornamento via email non attivo"});a.enableAbuse();a.enableRating()});']
there is lat/long portion that I want to extract from this object which is "longitude:13.37489,latitude:42.36009". I am not sure how to do this

Here's sample python code using a regex to extract the coords:
import re
soupObj = [u'$(function(){SEAT.PG.initDialog(".generate-popup-3030",[{msez:"3030",c:"#333",o:0.5,f:false,html:SEAT.PG.getImgPopHtml}]);SEAT.PG.mappaInterattiva({longitude:13.37489,latitude:42.36009,sito:"pgol",zoomLevel:"1",lng:1,mirino:"http://img.pgol.it/pgol/img/mk_pallino.png",allowFoto:true,mapType:null,streetView:false,dr:false,addMobile:false,ums:"sorellenurzia"});var a=SEAT.commenti({__2011_commento_click_stella:"Clicca su una stella per dare il tuo voto",__2011_commento_da_evitare:"Da evitare",__2011_commento_di_meglio:"C\'\xe8 di meglio",__2011_commento_non_male:"Non male",__2011_commento_mi_piace:"Mi piace",__2011_commento_consigliato:"Consigliato",__2011_commento_scrivi:"Scrivi una recensione per condividere la tua esperienza con gli altri utenti",__2011_commento_breve:"Scrivi almeno 120 caratteri per dare informazioni utili e complete a chi legger\xe0 la recensione.",__2011_commento_manca_voto:"Ti sei dimenticato di dare un voto",__2011_commento_servizio_non_disponibile:"Il servizio al momento non \xe8 disponibile",__2011_commento_segnala:"Segnala la recensione",__2011_commento_segnala_msg1:"Ritieni che questa recensione sia offensiva o inappropriata a PagineGialle.it?",__2011_commento_segnala_msg2:"La nostra redazione si occuper\xe0 di controllarne il contenuto e, se necessario, di rimuoverlo dal sito",__2011_conferma:"conferma",__2011_annulla:"annulla",__2011_ha_scritto_il:"ha scritto il",__2011_pubblica:"pubblica",__2011_commento_modifica_recensione:"Modifica recensione",__2011_conferma_notifica:"Aggiornamento via email attivo",__2012_commenti_relatedopec:"Conosci anche queste attivit\xe0?",__2011_elimina_notifica:"Aggiornamento via email non attivo"});a.enableAbuse();a.enableRating()});']
m = re.search('longitude:([-+]?\d+.\d+),latitude:([-+]?\d+.\d)', soupObj[0])
if m:
longitude = m.group(1)
latitude = m.group(2)
print "longitude=%s, latitude=%s" % (longitude, latitude)
else:
print "Failed to match longitude, latitude."
Running this code yields:
longitude=13.37489, latitude=42.3

Related

Get full text below h2 tag with BeautifulSoup

I am trying to obtain different character's descriptions and habilities for a dataset.
The problem I've encountered is that there seems to be a span tag within the h2 tag and in some cases a figure before de p tags. This is the format I'm facing:
<h2><span class="mw-headline" id="Apariencia">Apariencia</span></h2>
<figure class="thumb tleft " style="width: 100px">
<p>...</p>
<p>...</p>
<p>...</p>
<h2><span class="mw-headline" id="Personalidad">Personalidad</span></h2>
<p>...</p>
<p>...</p>
<p>...</p>
I need to obtain the text in those paragraphs.
I have tried something like this but it obviously does not work.
import urllib.request
from bs4 import BeautifulSoup
fp = urllib.request.urlopen("https://jojo.fandom.com/es/wiki/Star_Platinum")
mybytes = fp.read()
html_doc = mybytes.decode("utf8")
fp.close()
soup = BeautifulSoup(html_doc, 'html.parser')
spans = soup.find_all('span', {"class": "mw-headline"})
for s in spans:
print(s.nextSibling.getText)
You can search backwards for previous <h2> and store result in the dictionary:
from bs4 import BeautifulSoup
html_doc = '''\
<h2><span class="mw-headline" id="Apariencia">Apariencia</span></h2>
<figure class="thumb tleft " style="width: 100px">
<p>T1 ...</p>
<p>T2 ...</p>
<p>T3 ...</p>
<h2><span class="mw-headline" id="Personalidad">Personalidad</span></h2>
<p>T4 ...</p>
<p>T5 ...</p>
<p>T6 ...</p>'''
soup = BeautifulSoup(html_doc, 'html.parser')
out = {}
for p in soup.select('p'):
previous_h2 = p.find_previous('h2')
out.setdefault(previous_h2.text, []).append(p.text)
print(out)
Prints:
{
'Apariencia': ['T1 ...', 'T2 ...', 'T3 ...'],
'Personalidad': ['T4 ...', 'T5 ...', 'T6 ...']
}
I think in this case, .select with CSS selectors would be very useful.
To get all the section headers, you can use the selector h2:has(span.mw-headline[id]); and to get a specific header by the id attribute value (hId below) of the span nested within, you can use the selector hSel below.
hId = 'Personalidad' # for example
hSel = f'h2:has(span.mw-headline[id="{hId}"])'
Then, to get all the tags after that header, you can use f'{hSel}~*', but you also need to filter out the tags after the next header to only get tags in that section, so the full selector would be
sSel = f'{hSel}~*:not({hSel}~h2~*):not(h2)'
[:not({hSel}~h2~*) filters out the tags after the next header, and :not(h2) filters out the next header tag itself.]
Making use of this, the function below returns a dictionary containing section header, text and html.
def get_wikiSection(header, wSoup, sec1Header='? Abstract ?'):
sSel = 'h2:has(span.mw-headline[id])'
sSel = f'*:has(~{sSel}):not({sSel}~*)'
if not header: hId = hSel = None # [first section has no header]
elif isinstance(header, str):
hId, hSel = header, f'h2:has(span.mw-headline[id="{header}"])'
header = wSoup.select_one(hSel)
if not header: return {'errorMsg': f'Not found: {hSel}'}
else: hId = header.select_one('span.mw-headline[id]')['id']
## header SHOULD BE: None/hId/a tag containing span.mw-headline[id] ##
if hId:
hSel = f'h2:has(span.mw-headline[id="{hId}"])'
sSel = f'{hSel}~*:not({hSel}~h2~*):not(h2)'
header = header.get_text(' ').strip()
else: header = sec1Header
sect = wSoup.select(sSel)
sText = '\n'.join([s.get_text(' ').strip() for s in sect])
sHtml = '\n'.join([''.join(s.prettify().splitlines()) for s in sect])
if not sect: sText = sHtml = None
return {'headerId': hId, 'sectionHeader': header,
'sectionText': sText, 'sectionHtml': sHtml}
For example, get_wikiSection('Personalidad', soup) will return
{
'headerId': 'Personalidad',
'sectionHeader': 'Personalidad',
'sectionText': 'Jotaro describió a Star Platinum como un ser muy violento. Suele ser silencioso, excepto cuando lanza golpes, gritando "ORA ORA ORA" en voz alta, bastante rápido y repetidamente. Con una cara relativamente humana ha demostrado tener expresiones tales como fruncir el ceño y sonreír.\nStar Platinum demuestra un tipo de interés en la auto-conservación, como se ve cuando detiene una bala que Jotaro dispara experimentalmente en su propia cabeza, protege a un Jotaro incapacitado de los ataques de DIO durante los efectos de su The World , y lo revive de cerca de la muerte directamente hacia latir su corazón (Sin embargo, considerando el papel pionero de Star Platinum en la serie, esta capacidad puede hablar principalmente de cualidades metafísicas o subconscientes genéricas para los usuarios de Stand).\nEn el manga original, Star Platinum desde el principio se ve con una sonrisa amplia y desconcertante. Más tarde, Star Platinum gana el rostro estoico de Jotaro, cualquier sonrisa futura va a advertir a la persona que se dirige a un gran dolor inminente.\nStar Platinum lleva el nombre de la carta del Tarot La Estrella , que simboliza el optimismo, el discernimiento y la esperanza.',
'sectionHtml': '<p> Jotaro describió a Star Platinum como un ser muy violento. Suele ser silencioso, excepto cuando lanza golpes, gritando "ORA ORA ORA" en voz alta, bastante rápido y repetidamente. Con una cara relativamente humana ha demostrado tener expresiones tales como fruncir el ceño y sonreír.</p>\n<p> Star Platinum demuestra un tipo de interés en la auto-conservación, como se ve cuando detiene una bala que Jotaro dispara experimentalmente en su propia cabeza, protege a un Jotaro incapacitado de los ataques de DIO durante los efectos de su The World , y lo revive de cerca de la muerte directamente hacia latir su corazón (Sin embargo, considerando el papel pionero de Star Platinum en la serie, esta capacidad puede hablar principalmente de cualidades metafísicas o subconscientes genéricas para los usuarios de Stand).</p>\n<p> En el manga original, Star Platinum desde el principio se ve con una sonrisa amplia y desconcertante. Más tarde, Star Platinum gana el rostro estoico de Jotaro, cualquier sonrisa futura va a advertir a la persona que se dirige a un gran dolor inminente.</p>\n<p> Star Platinum lleva el nombre de la carta del Tarot <a class="extiw" href="http://en.wikipedia.org/wiki/es:La_Estrella_(Tarot)" title="wikipedia:es:La Estrella (Tarot)"> La Estrella </a> , que simboliza el optimismo, el discernimiento y la esperanza.</p>'
}
If you want all the sections:
h2Tags = soup.select('h2:has(span.mw-headline[id])')
wikiSections = [get_wikiSection(h, soup) for h in [None]+h2Tags]
The resulting list of dictionaries can also be converted to a pandas DataFrame as simply as pd.DataFrame(wikiSections).

How could I extract the content of an article from a html webpage using python Beautiful Soup?

I am a novice wiht python and I am trying to do webscraping as exercise. I would like to scrape the content, and the title of each article inside a web page .
I have a problem with my code because I do not think is very efficient and I would like to optimize it.
the page I am trying to scrape is https://www.ansa.it/sito/notizie/politica/politica.shtml
this is what I have done so far:
#libraries
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup as soup
import requests
import pandas as pd
import urllib.request,sys,time
import csv
from csv import writer
import time
from datetime import datetime
r= requests.get('https://www.ansa.it/sito/notizie/politica/politica.shtml')
b= soup(r.content, 'lxml')
title=[]
links=[]
content=[]
for c in b.findAll('h3',{'class':'news-title'}):
title.append(c.text.strip())
for c in b.findAll("h3", {"class": "news-title"}):
links.append(c.a["href"])
for link in links:
page=requests.get('https://www.ansa.it'+link)
bsjop=soup(page.content)
for n in bsjop.findAll('div',{'itemprop': 'articleBody'}):
content.append(n.text.strip())
The problem is that my output is made of multiple links, multiple titles and multiple contents that do not match each other (like one article has title and a content that has nothing to do with it)
If you know ways that I can improve my code it would be nice
thanks
To get all articles titles, urls, texts into a Pandas DataFrame you can use next example (I used tqdm module to get nice progress bar):
import requests
from tqdm import tqdm
from bs4 import BeautifulSoup
url = "https://www.ansa.it/sito/notizie/politica/politica.shtml"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
all_data = []
for title in tqdm(soup.select("h3.news-title")):
t = title.get_text(strip=True)
u = title.a["href"]
s = BeautifulSoup(
requests.get("https://www.ansa.it" + u).content, "html.parser"
)
text = s.select_one('[itemprop="articleBody"]')
text = text.get_text(strip=True, separator="\n") if text else ""
all_data.append([t, u, text])
df = pd.DataFrame(all_data, columns=["Title", "URL", "Text"])
df.to_csv("data.csv", index=False)
Creates data.csv (screenshot from LibreOffice):
import requests
from bs4 import BeautifulSoup
import pandas as pd
news_list = []
r = requests.get('https://www.ansa.it/sito/notizie/politica/politica.shtml')
soup = BeautifulSoup(r.text, 'html.parser')
articles = soup.select('article.news')
for art in articles:
try:
title = art.select_one('h3').text.strip()
if 'javascript:void(0);' in art.select('a')[0].get('href'):
url = 'https://www.ansa.it' + art.select('a')[1].get('href')
else:
url = 'https://www.ansa.it' + art.select('a')[0].get('href')
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.select_one('div.news-txt').text.strip()
print(f'retrieving {url}')
news_list.append((title, content, url))
except Exception as e:
print(art.text.strip(), e)
df = pd.DataFrame(news_list, columns = ['Title', 'Content', 'Url'])
print(df)
This will return some errors for some links on page, which you will have to investigate and debug (and ask for help if you need it - it's an important part of learning process), and a dataframe with the list successfully retrieved, which looks like this:
Title Content Url
0 Letta: 'Ora difficile ricomporre con M5s'. Mel... Partiti scossi dallo scioglimento anticipato d... https://www.ansa.it/sito/notizie/politica/2022...
1 L'emozione di Draghi: 'Ancheil cuore dei banch... "Certe volte anche il cuore dei banchieri cent... https://www.ansa.it/sito/notizie/politica/2022...
2 La giornata di Draghi in foto https://www.ansa.it/sito/photogallery/primopia...
3 Il timing del voto, liste entro un mese. A Fer... Le liste dei candidati entro un mese a partire... https://www.ansa.it/sito/notizie/politica/2022...
4 Si lavora sulla concorrenza, ipotesi stralcio ... Il DDL Concorrenza andrà in Aula alla Camera l... https://www.ansa.it/sito/notizie/economia/2022...
5 Le cifre del governo Draghi: 55 voti fiducia e... Una media di 7,4 leggi approvate ogni mese su ... https://www.ansa.it/sito/notizie/politica/2022...
6 I 522 giorni del governo Draghi LE FOTO L'arrivo di SuperMario, gli incontri, le allea... https://www.ansa.it/sito/photogallery/primopia...
7 Presidi, disappunto per le urne in autunno, ci... "C'è disappunto non preoccupazione per le urne... https://www.ansa.it/sito/notizie/politica/2022...
8 Ucraina: Di Maio,sostegno ricerca mercati alte... (ANSA) - ROMA, 22 LUG - Lo scoppio del conflit... https://www.ansa.it/sito/photogallery/primopia...
9 Il giorno più lungo: dal Senato fiducia a Drag... Passa la fiducia al premier Draghi in Senato, ... https://www.ansa.it/sito/notizie/politica/2022...
10 Oltre mille sindaci a sostegno di Draghi Nei giorni che attendono il mercoledì che deci... https://www.ansa.it/sito/notizie/politica/2022...
11 Mattarella scioglie le Camere, si vota il 25 s... E' stata una scelta "inevitabile", il voto del... https://www.ansa.it/sito/notizie/politica/2022...
12 Camere sciolte ma il vitalizio è salvo Nonostante lo scioglimento delle Camere antici... https://www.ansa.it/sito/notizie/politica/2022...
13 Ultimatum di Conte, risposte o fuori. Di Maio:... Senza "risposte chiare" il Movimento 5 Stelle ... https://www.ansa.it/sito/notizie/politica/2022...
14 Di Maio, Conte sta compiendo una vendetta poli... Se le cose restano come sono oggi "Mario Dragh... https://www.ansa.it/sito/notizie/politica/2022...
15 Governo: mercoledì la fiducia fiducia prima al... Le comunicazioni del presidente del Consiglio ... https://www.ansa.it/sito/notizie/politica/2022...
16 Il giorno più lungo: dal Senato fiducia a Drag... Passa la fiducia al premier Draghi in Senato, ... https://www.ansa.it/sito/notizie/politica/2022...
17 Mattarella scioglie le Camere, si vota il 25 s... E' stata una scelta "inevitabile", il voto del... https://www.ansa.it/sito/notizie/politica/2022...
18 Il discorso di Draghi al Senato 'Partiti, pron... "Siamo qui perché lo hanno chiesto gli italian... https://www.ansa.it/sito/notizie/politica/2022...
19 Governo: mercoledì la fiducia fiducia prima al... Le comunicazioni del presidente del Consiglio ... https://www.ansa.it/sito/notizie/politica/2022...
20 Draghi al Senato per una fiducia al buio. Prem... Draghi al bivio tra governo e crisi. Alle 9.30... https://www.ansa.it/sito/notizie/politica/2022...
21 Ultimatum di Conte, risposte o fuori. Di Maio:... Senza "risposte chiare" il Movimento 5 Stelle ... https://www.ansa.it/sito/notizie/politica/2022...
22 Camere sciolte ma il vitalizio è salvo Nonostante lo scioglimento delle Camere antici... https://www.ansa.it/sito/notizie/politica/2022...
You don't need two different loops if you are referring to the same element. Try the below code to save the title and links.
for c in b.findAll('h3',{'class':'news-title'}):
title.append(c.text.strip())
links.append(c.a["href"])
By combining you will be sure that the title and link are scraped from the same element.

How to parse XML in Python and store info in a dictionary

I have an XML file from TED talks with the following structure:
<xml language="it"><file id="1">
<head>
<url>http://www.ted.com/talks/travis_kalanick_uber_s_plan_to_get_more_people_into_fewer_cars</url>
<pagesize>79324</pagesize>
<dtime>Fri Apr 01 01:00:04 CEST 2016</dtime>
<encoding>UTF-8</encoding>
<content-type>text/html; charset=utf-8</content-type>
<keywords>talks, Brand, Internet, business, cars, china, cities, economics, entrepreneur, environment, future, green, india, innovation, invention, investment, mobility, pollution, potential, society, software, sustainability, technology, transportation, web</keywords>
<speaker>Travis Kalanick</speaker>
<talkid>2443</talkid>
<videourl>http://download.ted.com/talks/TravisKalanick_2016.mp4</videourl>
<videopath>talks/TravisKalanick_2016.mp4</videopath>
<date>2016/02/15</date>
<title>Travis Kalanick: Il progetto di Uber di mettere più persone in meno auto</title>
<description>TED Talk Subtitles and Transcript: Uber non ha cominciato con grandi ambizioni di ridurre il traffico e l'inquinamento. Ma quando l'azienda ha decollato, il suo cofondatore Travis Kalanick si è chiesto se ci fosse un modo per far usare Uber alle persone sullo stesso percorso e far loro condividere i tragitti, riducendo allo stesso tempo i costi e l'impronta ecologica. Il risultato: uberPOOL, il servizio di condivisione dell'auto dell'azienda, che nei suoi primi otto mesi ha tolto dalle strade 7.9 milioni di miglia e 1.400 tonnellate di diossido di carbonio dall'aria a Los Angeles. Ora Kalanick afferma che la condivisione dell'auto potrebbe funzionare anche per i pendolari nelle periferie. "Con la tecnologia a disposizione e un po' di leggi intelligenti," afferma, "possiamo trasformare ogni auto in un'auto condivisa e riappropriarci immediatamente delle nostre città."</description>
<transcription>
<seekvideo id="680">Stamattina, vorrei parlarvi del futuro</seekvideo>
<seekvideo id="6064">dei trasporti a guida umana,</seekvideo>
<seekvideo id="9560">di come possiamo ridurre il traffico, l'inquinamento e i parcheggi</seekvideo>
<seekvideo id="15640">mettendo più persone in meno macchine,</seekvideo>
<seekvideo id="19840">e di come possiamo farlo con la tecnologia che sta nelle nostre tasche.</seekvideo>
<seekvideo id="25840">Sì, sto parlando degli smartphone...</seekvideo>
<seekvideo id="28720">non delle auto senza autista.</seekvideo>
<seekvideo id="31120">Ma per cominciare, dobbiamo tornare indietro di oltre 100 anni.</seekvideo>
<seekvideo id="1140160">Grazie mille." TK: "Grazie mille a te."</seekvideo>
<seekvideo id="1142240">(Applauso)</seekvideo>
</transcription>
<translators>
<translator href="http://www.ted.com/profiles/2859034">Maria Carmina Distratto</translator>
</translators>
<reviewers>
<reviewer href="http://www.ted.com/profiles/5006808">Enrica Pillon</reviewer>
</reviewers>
<wordnum>2478</wordnum>
<charnum>14914</charnum>
</head>
<content>Stamattina, vorrei parlarvi del futuro dei trasporti a guida umana, di come possiamo ridurre il traffico, l'inquinamento e i parcheggi mettendo più persone in meno macchine, e di come possiamo farlo con la tecnologia che sta nelle nostre tasche. Sì, sto parlando degli smartphone... non delle auto senza autista.
Ma per cominciare, dobbiamo tornare indietro di oltre 100 anni. Perché si è scoperto che Uber esisteva molto prima di Uber. E se fosse sopravvissuta, il futuro dei trasporti sarebbe probabilmente già qui.
Permettetemi di presentarvi il Jitney. Fu creato o inventato nel 1914 da un tizio di nome LP Draper. Era un venditore di auto di Los Angeles, che ebbe un'idea: stava girando per il centro di Los Angeles, la mia città natale, e vide questi tram con lunghe file di persone che cercavano di andare dove volevano. E si disse: "Beh, perché non mettere un cartello sulla mia macchina per portare le persone ovunque vogliano per un jitney?" Un Jitney è un nichelino, in slang.
Le persone saltarono a bordo. E non solo a Los Angeles, ma in tutto il paese. E nel giro di un anno, il 1915, a Seattle si prendevano 50.000 passaggi al giorno, 45.000 passaggi al giorno in Kansas e 150.000 passaggi al giorno a Los Angeles. Per darvi un'idea, Uber a Los Angeles effettua 157.000 passaggi al giorno oggi, 100 anni dopo.
Ed ecco i tranvieri, color
"Travis, quello che stai creando è davvero incredibile e ti sono grato per averlo condiviso apertamente sul palco di TED.
Grazie mille." TK: "Grazie mille a te."
(Applauso)</content>
</file>
<file id="2">
<head>
<url>http://www.ted.com/talks/magda_sayeg_how_yarn_bombing_grew_into_a_worldwide_movement</url>
<pagesize>77162</pagesize>
<dtime>Fri Apr 01 01:00:32 CEST 2016</dtime>
<encoding>UTF-8</encoding>
<content-type>text/html; charset=utf-8</content-type>
<keywords>talks, TEDYouth, arts, beauty, creativity, entertainment, materials, street art</keywords>
<speaker>Magda Sayeg</speaker>
<talkid>2437</talkid>
<videourl>http://download.ted.com/talks/MagdaSayeg_2015Y.mp4</videourl>
<videopath>talks/MagdaSayeg_2015Y.mp4</videopath>
<date>2015/11/14</date>
<title>Magda Sayeg: Come lo yarn bombing è diventato un movimento internazionale</title>
<description>TED Talk Subtitles and Transcript: L'artista di tessuti Magda Sayeg trasforma i paesaggi urbani nel suo parco giochi personale decorando gli oggetti quotidiani con colorati lavori a maglia e a uncinetto. Queste calde e pelose "bombe di filo" sono partite dalle piccole cose, con i pali degli stop e gli idranti nella città natale di Sayeg, ma presto le persone hanno trovato una connessione con quest'arte e l'hanno diffusa nel mondo. "Viviamo in un questo frenetico mondo digitale, ma desideriamo ancora qualcosa con cui possiamo relazionarci", dice Sayeg. "Si può trovare del potenziale nascosto nei luoghi più impensabili e tutti possediamo doti che aspettano solo di essere scoperte."</description>
<transcription>
<seekvideo id="0">Sono un'artista di tessuti</seekvideo>
<seekvideo id="3080">meglio nota per aver dato inizio allo yarn bombing.</seekvideo>
<seekvideo id="6080">Yarn bombing significa inserire del materiale fatto a maglia</seekvideo>
<seekvideo id="9040">nell'ambiente urbano, tipo graffiti --</seekvideo>
<seekvideo id="11400">o, per la precisione,</seekvideo>
I would like to store all the info in a way such that I am able to match the ID of the talks and the sentences ID with the same sentences in other languages (same format).
So for example something like a dictionary as:
mydict["Ted_Talk_ID"]["Sentence_ID"]
Any idea on how to do it?
I tried with xml.etree.ElementTree but it gives me no output (but maybe I did some errors). My code is the following:
import xml.etree.ElementTree as ET
root = ET.parse('ted_it-20160408.xml').getroot()
for type_tag in root.findall('url'):
value = type_tag.get('title')
print(value)
Thanks!
(if it could help: the data are from https://wit3.fbk.eu/mono.php?release=XML_releases&tinfo=cleanedhtml_ted)
you can use by using xml.etree.ElementTree, check this link https://www.geeksforgeeks.org/xml-parsing-python/
This function is perfectly adapted for your use :
def parseXML(xmlfile):
# create element tree object
tree = ET.parse(xmlfile)
# get root element
root = tree.getroot()
# create empty list for news items
newsitems = []
# iterate news items
for item in root.findall('./channel/item'):
# empty news dictionary
news = {}
# iterate child elements of item
for child in item:
# special checking for namespace object content:media
if child.tag == '{http://search.yahoo.com/mrss/}content':
news['media'] = child.attrib['url']
else:
news[child.tag] = child.text.encode('utf8')
# append news dictionary to news items list
newsitems.append(news)
# return news items list
return newsitems

Regular expression findall python

I have text which look like that
{"#context":"http://schema.org","#type":"Recipe","name":"Tartelette aux fraises et rhubarb'curd","recipeCategory":"tarte aux fraises","image":"https://assets.afcdn.com/recipe/20160527/8530_w1024h768c1cx1941cy2911.jpg","datePublished":"2012-10-10T08:48:00+02:00","prepTime":"PT90M","cookTime":"PT15M","totalTime":"PT105M","recipeYield":"4 personnes","recipeIngredient":["250 g de fraises","150 g de farine","45 g de beurre","40 g de sucre","1 oeuf","1 pinc\u00e9e de sel","20 cl de rhubarbe (r\u00e9cup\u00e9r\u00e9 de ma conception de compote)","3 oeufs","75 g de sucre","1 cuill\u00e8re \u00e0 soupe de ma\u00efzena"],"recipeInstructions":[{"#type":"HowToStep","text":"Pour 4 tartelettes ( ou une grande tarte mais je pr\u00e9f\u00e8re les tartelettes, la p\u00e2te sabl\u00e9e \u00e9tant difficile \u00e0 couper :)) "},{"#type":"HowToStep","text":"Pr\u00e9parer la p\u00e2te sabl\u00e9e : "},{"#type":"HowToStep","text":"Couper le beurre en petits morceaux."},{"#type":"HowToStep","text":"Mettre tous les ingr\u00e9dients dans un saladier et tout m\u00e9langer \u00e0 la main ( ou au robot) jusqu'\u00e0 former une boule homog\u00e8ne. La r\u00e9server au frais au moins 1h pour pouvoir mieux l'\u00e9taler."},{"#type":"HowToStep","text":"Pendant que la p\u00e2te sabl\u00e9es pose, pr\u00e9parer le rhubarb'curd : "},{"#type":"HowToStep","text":"M\u00e9langer le sucre avec le jus de rhubarbe sur feu doux, jusqu\u2019\u00e0 ce que le sucre soit fondu. "},{"#type":"HowToStep","text":"A part, dans un bol (qui pourra aller au bain marie dans l'\u00e9tape suivante), battre la ma\u00efzena avec 1 oeuf. Lorsqu\u2019elle est bien dissoute, incorporer les 2 autres oeufs, toujours en fouettant."},{"#type":"HowToStep","text":"Incorporer ensuite le jus de rhubarbe chaud en fouettant bien, le m\u00e9lange commence \u00e0 \u00e9paissir. Placer le bol au bain marie et faire \u00e9paissir sur feu doux tout en fouettant tr\u00e8s r\u00e9guli\u00e8rement."},{"#type":"HowToStep","text":"Une fois qu\u2019elle est bien \u00e9paisse, transf\u00e9rer dans un autre bol ou saladier pour la refroidir. "},{"#type":"HowToStep","text":"Pendant que le curd refroidit, cuire la p\u00e2te sabl\u00e9e \u00e0 blanc. Etaler la p\u00e2te sabl\u00e9e et la r\u00e9partir dans les 4 moules \u00e0 tartelette (ou dans un grand moule \u00e0 tarte). Puis enfourner entre 10 et 15 min (en fonction de votre four) \u00e0 200\u00b0C (thermostat 6-7)."},{"#type":"HowToStep","text":"Laisser refroidir les fonds une bonne demi heure."},{"#type":"HowToStep","text":"Monter les tartelettes : "},{"#type":"HowToStep","text":"- mettre une couche de rhubarb' curd dans les fonds de tarte"},{"#type":"HowToStep","text":"- laver et \u00e9queuter les fraises"},{"#type":"HowToStep","text":"- les couper en 2 et les disposer sur le rhubarb'curd."},{"#type":"HowToStep","text":"- conserver au frais avant de servir"}],
In the field RecipeInstructions I need to get everything write after "text": . I never used regular expression and I'm a little bit lost.
This looks like a json object but doesn't have [] around it to make it an actual list. You should be able to convert it into a Python native list of dictionaries and navigate it:
import json
recipe = json.loads('[' + your_text + ']')
steps = [obj["text"] for obj in recipe if obj.get("#type") == "HowToStep"]
What worries me though is that unless you truncated your text to post here, this may not be a well formed json. In which case you cannot use the above code and instead use regular expressions like this:
import re
regex = r"\"text\":\"([^\"]*)\""
matches = re.findall(regex, your_text)
'matches' should now be a list of all the text elements.
Curious about how this regex works? Here's a simulator

How can I detect whether a given line in a file is a proper English sentence?

I need to detect if a given "line" in a file is an English sentence or not. I am using Python. An approximate answer would do. I understand this is an NLP question but is there a lightweight tool that gives a reasonable approximation? I do not want to use a full-fledged NLP toolkit for this though if that is the only way then it is fine.
If NLP toolkit is the answer then the one that I am reading about is the Natural Language Toolkit. If anyone has a simple example on how to detect a sentence handy, please point me to it.
Perhaps you are looking for Punkt Tokenizer from the nltk library, which can provide you the english sentences from a given text. You can then act upon the sentences by doing a grammar check(pointed out by Acron)
Currently, computer software cannot tell you whether a given string of tokens is a grammatical English sentence with any reasonable degree of reliability. You might, however, look into Amazon's Mechanical Turk. If you present the sentence to five native English speakers, and the majority of them say it is grammatical, you can assume it is with a reasonable level of certainty.
Of course, while Mechanical Turk does have a Web Services API and thus could be used from Python, it will not be real-time.
You can use Python Reverend. It has less the 400 lines of code. Take a look in how can you use it:
>>> from thomas import Bayes
>>> guesser = Bayes()
>>> guesser.train("en" u"a about above after again against all am an and any are aren't as at be because been before being below between both but by can't cannot could couldn't did didn't do does doesn't doing don't down during each few for from further had hadn't has hasn't have haven't having he he'd he'll he's her here here's hers herself him himself his how how's i i'd i'll i'm i've if in into is isn't it it's its itself let's me more most mustn't my myself no nor not of off on once only or other ought our ours ourselves out over own same shan't she she'd she'll she's should shouldn't so some such than that that's the their theirs them themselves then there there's these they they'd they'll they're they've this those through to too under until up very was wasn't we we'd we'll we're we've were weren't what what's when when's where where's which while who who's whom why why's with won't would wouldn't you you'd you'll you're you've your yours yourself yourselves")
>>> guesser.train("pt" u"último é acerca agora algmas alguns ali ambos antes apontar aquela aquelas aquele aqueles aqui atrás bem bom cada caminho cima com como comprido conhecido corrente das debaixo dentro desde desligado deve devem deverá direita diz dizer dois dos e ela ele eles em enquanto então está estão estado estar estará este estes esteve estive estivemos estiveram eu fará faz fazer fazia fez fim foi fora horas iniciar inicio ir irá ista iste isto ligado maioria maiorias mais mas mesmo meu muito muitos nós não nome nosso novo o onde os ou outro para parte pegar pelo pessoas pode poderá podia por porque povo promeiro quê qual qualquer quando quem quieto são saber sem ser seu somente têm tal também tem tempo tenho tentar tentaram tente tentei teu teve tipo tive todos trabalhar trabalho tu um uma umas uns usa usar valor veja ver verdade verdadeiro você")
>>> guesser.train("es" u"un una unas unos uno sobre todo también tras otro algún alguno alguna algunos algunas ser es soy eres somos sois estoy esta estamos estais estan como en para atras porque por qué estado estaba ante antes siendo ambos pero por poder puede puedo podemos podeis pueden fui fue fuimos fueron hacer hago hace hacemos haceis hacen cada fin incluso primero desde conseguir consigo consigue consigues conseguimos consiguen ir voy va vamos vais van vaya gueno ha tener tengo tiene tenemos teneis tienen el la lo las los su aqui mio tuyo ellos ellas nos nosotros vosotros vosotras si dentro solo solamente saber sabes sabe sabemos sabeis saben ultimo largo bastante haces muchos aquellos aquellas sus entonces tiempo verdad verdadero verdadera cierto ciertos cierta ciertas intentar intento intenta intentas intentamos intentais intentan dos bajo arriba encima usar uso usas usa usamos usais usan emplear empleo empleas emplean ampleamos empleais valor muy era eras eramos eran modo bien cual cuando donde mientras quien con entre sin trabajo trabajar trabajas trabaja trabajamos trabajais trabajan podria podrias podriamos podrian podriais yo aquel")
>>> guesser.guess(u'what language am i speaking')
>>> [('en', 0.99990000000000001)]
>>> guesser.guess(u'que língua eu estou falando')
>>> [('pt', 0.99990000000000001)]
>>> guesser.guess(u'en qué idioma estoy hablando')
>>> [('es', 0.99990000000000001)]
You should be very careful on choosing the best training data for your needs. Just for giving an idea to you I collect some stop words from English, Portuguese and Spanish.

Categories