2013-08-08 7 views
8

Ich versuche, Inhalt von bestimmten Meta-Tags auslesen. Hier ist die Struktur der Meta-Tags. Die ersten beiden werden mit einem umgekehrten Schrägstrich geschlossen, aber der Rest hat keine abschließenden Tags. Sobald ich das 3. Meta-Tag erhalte, wird der gesamte Inhalt zwischen den Tags zurückgegeben. Ich habe auch soup.findAll(text=re.compile('keyword')) versucht, aber das gibt nichts zurück, da Schlüsselwort ein Attribut des Metatags ist.Extrahieren von Inhalten von bestimmten Meta-Tags, die nicht geschlossen werden 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'> 

Hier ist der Code:

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

Also, was Ausgang hoffen, Sie zu bekommen? – sihrc

+0

Ich möchte den Inhalt des Meta-Tags mit name = "description" – tcash21

Antwort

21

Obwohl ich nicht sicher bin, wird es für jede Seite arbeiten:

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')) 

Ausbeuten:

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

Ich habe das versucht - ich bekomme einen Syntaxfehler auf 'desc' für die Anweisung print desc [0] ['content']. Encode ('utf-8 ') ... wenn ich herausfinde, warum ich hier zurück posten werde .. Das lag daran, dass die print - Anweisung nicht in() eingeschlossen war - also, print (desc [0] [' content ']. encode (' utf -8 ')) ... Ich benutze Python 3.4.1, nicht aktualisieren Antwort, weil nicht sicher, ob versionsspezifische – cutrightjm

+0

Ja sorry, das war für python2.7 – sihrc

4

Beschreibung ist Fall -Sensitiv.So, wir müssen nach beiden suchen Beschreibung 'und' Beschreibung '.

Case1: 'Beschreibung' in Flipkart.com

Case2: 'description' 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

Wenn beide vorhanden sind, wahrscheinlich die beiden Ergebnisse kombinieren möchten, anstatt nur nach Kleinbuchstaben suchen, wenn Großbuchstaben keine ist. – sihrc

3
soup3 = BeautifulSoup(page3, 'html5lib') 

xhtml erfordert den Meta-Tag richtig geschlossen werden, html5 nicht. Der html5lib Parser ist "permissiver".

0

Try (basierend auf this Blog-Post)

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() 

Getestet gegen folgende Varianten:

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

Gebrauchte BeautifulSoup Version 4.4.1

0

Wie von ingo vorgeschlagen, dass Sie eine weniger strenge Parser wie html5 nutzen könnten.

soup3 = BeautifulSoup(page3, 'html5lib') 

aber sicher sein, python-html5lib Parser auf dem System verfügbar zu haben.

1

Ich denke, hier verwenden regexp sollte besser sein: Beispiel:

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