2016-07-16 3 views
0

Я работаю над приложением, которое использует beatifulsoup, Python, запросы и django. Я как бы схватил, как использовать красивый суп. Но сверление кажется, что разные элементы иногда путают. Я создал функцию, хотя и не лучшую, что царапины ссылки из сообщений и использует эти ссылки, чтобы перейти на страницу подробностей сообщений. И с этой страницы очистите данные сценария, содержащие URL-адрес facebook и связанное с ним изображение. Это кодКак извлечь значения из словаря, полученного из моих результатов beautifulsoup?

из моего scraper.py

def panties(): 
    pan_url = 'http://www.panvideos.com' 
    html = requests.get(pan_url, headers=headers) 
    soup = BeautifulSoup(html.text, 'html5lib') 
    video_row = soup.find_all('div', {'class': 'video'}) 

    def youtube_link(url): 
     youtube_page = requests.get(url, headers=headers) 
     soupdata = BeautifulSoup(youtube_page.text, 'html5lib') 
     video_row = soupdata.find('div', {'class': 'video-player'}) 
     entries = [{'text': str(div), 
        } for div in video_row][3] 
     return entries 

    entries = [{'text': div.h4.text, 
       'href': div.a.get('href'), 
       'tube': youtube_link(div.a.get('href')), 
       } for div in video_row][:3] 

    return entries 

из моего views.py

pan = panties() 
    context = { 
     'pan': pan, 
    } 
    return render(request, 'index.html', context) 

и в моем шаблоне

{% for p in pan %} 
    Title: {{p.text}}<br> 
    Href: {{p.href}}<br> 
    Tube: {{p.tube}}<hr> 
{% endfor %} 

и Херес, что она возвращает

Title: Juanka - Esperando por ti (Official Video) 
Href: http://www.videos.com/video/2962/juanka-esperando-por-ti-official-video-/ 
Tube: {'text': '<script type="text/javascript">jwplayer("video-setup").setup({file:"http://www.youtube.com/watch?v=QL4JFUHd71o",image:"http://i1.ytimg.com/vi/QL4JFUHd71o/maxresdefault.jpg",primary:"html5",stretching:"fill","controlbar":"bottom",width:"100%",aspectratio:"16:9",autostart:"true",logo:{file:"http://www.panvideos.com/uploads/gopcds-png5787dbcd53a72.png",position:"bottom-right",link:"http://www.panvideos.com/"},sharing:{link:"http://www.panvideos.com/video/2962/juanka-esperando-por-ti-official-video-/","sites":["facebook","twitter","linkedin","pinterest","tumblr","googleplus","reddit"]}});</script>'} 

моя вещь, я только хочу

http://www.youtube.com/watch?v=QL4JFUHd71o 

и

http://i1.ytimg.com/vi/QL4JFUHd71o/maxresdefault.jpg 

которые являются видео и изображения соответственно. Как я могу это сделать. Мой код не установлен в камне, и я не против его изменения, чтобы он работал. Спасибо за любой совет, который я продвигаю.

ответ

0

Если я хорошо понимаю, вы хотите найти 2 элемента из вашего объекта p.tube BeautifulSoup. Я назову его soup для более легкого понимания.

Во-первых, я бы избавился от <script> с помощью функции soup.text.

Тогда я хотел бы использовать регулярное выражение повторно пакет https://docs.python.org/2/library/re.html найти .setup(, чтобы избавиться от всего, что перед ним, и -2, чтобы избавиться от ); в конце

import re 
s = re(".setup(", soup) 
soup = soup[s.end:-2] 

, а затем, чтобы превратить ваш строка в словаре, то советую использовать ast.literal_eval: Convert a String representation of a Dictionary to a dictionary?

к сожалению, (что было бы легко) ваша строка не хорошо отформатирован быть легко преобразован в словарь.

Поэтому я хотел бы избавиться от {}, и разделить с коматозных ,

soup = soup[1:-1] 
l = soup.split(',') 

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

+0

Здравствуйте спасибо для ответа. Но как я смогу соответствовать этому коду. Ваше решение не работает так, как вы объяснили это с помощью моего кода, потому что p.tube или суп по вашему определению находится в шаблоне. так что я не могу сделать это import re s = re (". setup (", soup) soup = soup [s.end: -2] – losee

+0

Не могли бы вы взять то, что у вас есть, и написать свой код? t знать, с чего начать. Когда я попытался использовать s = re (".setup (", soup) Я получил ошибку« re not callable » – losee

+0

см. мои предыдущие ответы выше – losee

Смежные вопросы