2013-08-08 6 views
8

Sto cercando di analizzare il contenuto da metatag specifici. Ecco la struttura dei meta tag. I primi due sono chiusi con una barra rovesciata, ma il resto non ha tag di chiusura. Non appena ottengo il terzo meta tag, viene restituito l'intero contenuto tra i tag <head>. Ho anche provato soup.findAll(text=re.compile('keyword')) ma questo non restituisce nulla poiché la parola chiave è un attributo del meta tag.Estrazione di contenuti da metatag specifici che non vengono chiusi utilizzando BeautifulSoup

<meta name="csrf-param" content="authenticity_token"/> 
<meta name="csrf-token" content="OrpXIt/y9zdAFHWzJXY2EccDi1zNSucxcCOu8+6Mc9c="/> 
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> 
<meta content='en_US' http-equiv='Content-Language'> 
<meta content='c2y_K2CiLmGeet7GUQc9e3RVGp_gCOxUC4IdJg_RBVo' name='google-site- verification'> 
<meta content='initial-scale=1.0,maximum-scale=1.0,width=device-width' name='viewport'> 
<meta content='notranslate' name='google'> 
<meta content="Learn about Uber's product, founders, investors and team. Everyone's Private Driver - Request a car from any mobile phone—text message, iPhone and Android apps. Within minutes, a professional driver in a sleek black car will arrive curbside. Automatically charged to your credit card on file, tip included." name='description'> 

Ecco il codice:

import csv 
import re 
import sys 
from bs4 import BeautifulSoup 
from urllib.request import Request, urlopen 

req3 = Request("https://angel.co/uber", headers={'User-Agent': 'Mozilla/5.0') 
page3 = urlopen(req3).read() 
soup3 = BeautifulSoup(page3) 

## This returns the entire web page since the META tags are not closed 
desc = soup3.findAll(attrs={"name":"description"}) 
+1

Allora, cosa uscita speri di ottenere? – sihrc

+0

Voglio il contenuto del meta tag che ha name = "description" – tcash21

risposta

21

Anche se non sono sicuro che funzionerà per ogni pagina:

from bs4 import BeautifulSoup 
import urllib 

page3 = urllib.urlopen("https://angel.co/uber").read() 
soup3 = BeautifulSoup(page3) 

desc = soup3.findAll(attrs={"name":"description"}) 
print(desc[0]['content'].encode('utf-8')) 

Resa:

Learn about Uber's product, founders, investors and team. Everyone's Private Dri 
ver - Request a car from any mobile phoneΓÇötext message, iPhone and Android app 
s. Within minutes, a professional driver in a sleek black car will arrive curbsi 
de. Automatically charged to your credit card on file, tip included. 
+0

Ho provato questo - ottengo un errore di sintassi su 'desc' per l'istruzione print desc [0] ['content']. Encode ('utf-8 ') ... se capisco perché posterò di nuovo qui .. Questo era dovuto alla dichiarazione di stampa non essere racchiuso in() - quindi, stampare (desc [0] [' contenuto ']. codificare (' utf -8 ')) ... Sto usando python 3.4.1, non aggiornare la risposta perché non è sicuro se specifica la versione – cutrightjm

+0

Sì, scusa, questo era per python2.7 – sihrc

4

Descrizione è il caso -Sensibile.Così, dobbiamo cercare entrambi ' Descrizione 'e' descrizione '.

Case1: 'Descrizione' in Flipkart.com

Case2: 'Descrizione' in Snapdeal.com

from bs4 import BeautifulSoup 
import requests 

url= 'https://www.flipkart.com' 
page3= requests.get(url) 
soup3= BeautifulSoup(page3.text) 
desc= soup3.find(attrs={'name':'Description'}) 
if desc == None: 
    desc= soup3.find(attrs={'name':'description'}) 
try: 
    print desc['content'] 
except Exception as e: 
    print '%s (%s)' % (e.message, type(e)) 
+0

Se entrambi esistono, probabilmente si vogliono combinare i due risultati invece di cercare solo lettere minuscole, se maiuscole è Nessuno. – sihrc

3
soup3 = BeautifulSoup(page3, 'html5lib') 

xhtml richiede il meta tag da chiudere correttamente, HTML5 non lo fa. Il parser html5lib è più "permissivo".

0

Try (sulla base di this post sul blog)

from bs4 import BeautifulSoup 
... 
desc = "" 
for meta in soup.findAll("meta"): 
    metaname = meta.get('name', '').lower() 
    metaprop = meta.get('property', '').lower() 
    if 'description' == metaname or metaprop.find("description")>0: 
     desc = meta['content'].strip() 

testata nei confronti dei seguenti varianti:

  • <meta name="description" content="blah blah" /> (Example)
  • <meta id="MetaDescription" name="DESCRIPTION" content="blah blah" /> (Example)
  • <meta property="og:description" content="blah blah" /> (Example)

Usato versione BeautifulSoup 4.4.1

0

Come suggerito da Ingo si potrebbe usare un parser meno rigorosa come HTML5.

soup3 = BeautifulSoup(page3, 'html5lib') 

ma essere sicuri di avere python-html5lib parser disponibili sul sistema.

1

Penso qui usano espressioni regolari dovrebbe essere migliore: esempio:

resp = requests.get('url') 
soup = BeautifulSoup(resp.text) 
desc = soup.find_all(attrs={"name": re.compile(r'Description', re.I)}) 
Problemi correlati