2016-05-25 6 views
1

Я удалил следующий код с мобильного сайта IMDB с помощью BeautifulSoup с Python 2.7.Parsing IMDB with BeautifulSoup

Я хочу создать отдельный объект для номера эпизода '1', название 'Winter is Coming' и IMDB score '8.9'. Кажется, не может понять, как разделить номер эпизода и название.

<a class="btn-full" href="/title/tt1480055?ref_=m_ttep_ep_ep1"> 
    <span class="text-large"> 
     1. 
     <strong> 
     Winter Is Coming 
     </strong> 
    </span> 
    <br/> 
    <span class="mobile-sprite tiny-star"> 
    </span> 
    <strong> 
     8.9 
    </strong> 
    17 Apr. 2011 
    </a> 
+0

Я пошел, чтобы ответить на ваш вопрос, но потом понял, что-то неправильно понятым. Вы можете захватить название (если все эпизоды настроены таким образом), делая что-то вроде 'soup.select ('span> strong')', но это все равно оставляет вам необходимость захватить номер эпизода. – coralvanda

+0

«Зима идет ...» И ... Игра в игры престолов: D –

ответ

3

Вы можете использовать find, чтобы найти span с классом text-large к конкретному элементу вам нужно.

После того, как вы нужная span, вы можете использовать next, чтобы захватить следующую строку, содержащий номер эпизода и find, чтобы найти strong содержащего название

html = """ 
<a class="btn-full" href="/title/tt1480055?ref_=m_ttep_ep_ep1"> 
    <span class="text-large"> 
     1. 
     <strong> 
     Winter Is Coming 
     </strong> 
    </span> 
    <br/> 
    <span class="mobile-sprite tiny-star"> 
    </span> 
    <strong> 
     8.9 
    </strong> 
    17 Apr. 2011 
    </a> 
""" 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html) 
span = soup.find('span', attrs={'text-large'}) 
ep = str(span.next).strip() 
title = str(span.find('strong').text).strip() 

print ep 
print title 

> 1. 
> Winter Is Coming 
2

После того как вы каждый a class="btn-full", вы можете использовать классы span, чтобы получить теги, которые вы хотите, сильный тег является дочерним элементом диапазона с классом text-large, поэтому вам просто нужно позвонить .strong.text в тег, для диапазона с классом css mobile-sprite tiny-star вам нужно найти следующий сильный тег, поскольку он является дочерним элементом span, а не дочерним:

h = """<a class="btn-full" href="/title/tt1480055?ref_=m_ttep_ep_ep1"> 
    <span class="text-large"> 
     1. 
     <strong> 
     Winter Is Coming 
     </strong> 
    </span> 
    <br/> 
    <span class="mobile-sprite tiny-star"> 
    </span> 
    <strong> 
     8.9 
    </strong> 
    17 Apr. 2011 
    </a> 
""" 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(h) 
title = soup.select_one("span.text-large").strong.text.strip() 
score = soup.select_one("span.mobile-sprite.tiny-star").find_next("strong").text.strip() 

print(title, score) 

Что дает:

(u'Winter Is Coming', u'8.9') 

Если вы действительно хотите получить этот эпизод самый простой способ, чтобы разбить текст один раз:

soup = BeautifulSoup(h) 
ep, title = soup.select_one("span.text-large").text.split(None, 1) 
score = soup.select_one("span.mobile-sprite.tiny-star").find_next("strong").text.strip() 

print(ep, title.strip(), score) 

который даст вам:

(u'1.', u'Winter Is Coming', u'8.9') 
0

Использование url html scraping с regue st и поиск регулярных выражений.

import os, sys, requests 

frame = ('http://www.imdb.com/title/tt1480055?ref_=m_ttep_ep_ep1') 
f = requests.get(frame) 
helpme = f.text 
import re 
result = re.findall('itemprop="name" class="">(.*?)&nbsp;', helpme) 
result2 = re.findall('"ratingCount">(.*?)</span>', helpme) 
result3 = re.findall('"ratingValue">(.*?)</span>', helpme) 
print result[0].encode('utf-8') 
print result2[0] 
print result3[0] 

выход:

Winter Is Coming 
24,474 
9.0