2013-08-08 13 views
8

Próbuję przeanalizować zawartość z określonych znaczników meta. Oto struktura tagów meta. Pierwsze dwa są zamykane odwrotnym ukośnikiem, ale pozostałe nie mają żadnych znaczników zamykających. Jak tylko otrzymam trzeci metatag, zwrócona zostanie cała treść między tagami <head>. Próbowałem też soup.findAll(text=re.compile('keyword')), ale to nic nie zwraca, ponieważ słowo kluczowe jest atrybutem metatagu.Wyodrębnianie zawartości z określonych metatagów, które nie są zamknięte przy użyciu 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'> 

Oto kod:

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

Więc co wyjście masz nadzieję dostać? – sihrc

+0

Chcę zawartość metatagu o nazwie name "" description " – tcash21

Odpowiedz

21

Chociaż nie jestem pewien, że będzie działać na każdej stronie:

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

Wynik:

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

Próbowałem tego - otrzymuję błąd składniowy na' desc' dla instrukcji print desc [0] ['content']. Encode ('utf-8 ") ... jeśli znajdę wyjaśnienie, dlaczego będę tu wracał ... Było to spowodowane tym, że polecenie print nie jest zawarte w() - więc, print (desc [0] ['content']. encode ('utf -8 ')) ... Używam Pythona 3.4.1, nie aktualizowanie odpowiedzi, ponieważ nie jestem pewien, czy specyficzne dla wersji – cutrightjm

+0

Tak, przepraszam, to było dla python2.7 – sihrc

4

Opis jest przypadek -Sensitive.So, musimy szukać obu " Opis "i" opis ".

Przypadek 1: 'Opis' w Flipkart.com

Przypadek 2: 'opis' w 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

Jeśli oba istnieją, prawdopodobnie chcesz połączyć dwa wyniki zamiast szukać tylko małych liter, jeśli wielkie jest Brak. – sihrc

3
soup3 = BeautifulSoup(page3, 'html5lib') 

xhtml wymaga tag meta być prawidłowo zamknięte, HTML5 nie. Parser html5lib jest bardziej "permisywny".

0

Try (na podstawie this blogu)

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

Testowane wobec następujących wariantach:

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

Używane wersja BeautifulSoup 4.4.1

0

Jak sugeruje Ingo można użyć mniej rygorystyczne jak parser HTML5.

soup3 = BeautifulSoup(page3, 'html5lib') 

ale upewnij się, że dostępny jest parser python-html5lib w systemie.

1

myślę tu użyć wyrażenia regularnego powinno być lepiej: przykład:

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