2015-04-02 3 views
3

Это мой первый вопрос о StackOverflow. Я попытался найти решение здесь для своей проблемы, но, попробовав несколько предлагаемых решений, я все еще не могу заставить свой код работать.lxml.html. Ошибка чтения файла; Не удалось загрузить внешний объект

Я пытаюсь получить трейлер фильма URL с Youtube с помощью синтаксического анализа с lxml.html:

from lxml import html 
import lxml.html 
from lxml.etree import XPath 

def get_youtube_trailer(selected_movie): 
# Create the url for the YouTube query in order to find the movie trailer 
title = selected_movie 
t = {'search_query' : title + ' movie trailer'} 
query_youtube = urllib.urlencode(t) 
search_url_youtube = 'https://www.youtube.com/results?' + query_youtube 

# Define the XPath for the YouTube movie trailer link 
movie_trailer_xpath = XPath('//ol[@class="item-section"]/li[1]/div/div/div[2]/h3/a/@href') 

# Parse the YouTube html code 
html = lxml.html.parse(search_url_youtube) 

# Add the movie trailer to our results 
results['movie_trailer'] = 'https://www.youtube.com' + movie_trailer_xpath(html)[0] 

Я получаю следующее сообщение об ошибке:

File "C:/Users/Aleks/Google Drive/Udacity - Full Stack Web Dev Nanodegree/Lessons/Lesson 3a (Make Classes) - Movie Website/models.py", line 163, in <module> 
print get_youtube_trailer("titanic") 

File "C:/Users/Aleks/Google Drive/Udacity - Full Stack Web Dev Nanodegree/Lessons/Lesson 3a (Make Classes) - Movie Website/models.py", line 157, in get_youtube_trailer 
html = lxml.html.parse(search_url_youtube) 
File "C:\Python27\lib\site-packages\lxml\html\__init__.py", line 788, in parse 
return etree.parse(filename_or_url, parser, base_url=base_url, **kw) 
File "lxml.etree.pyx", line 3301, in lxml.etree.parse (src\lxml\lxml.etree.c:72453) 
File "parser.pxi", line 1791, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:105915) 
File "parser.pxi", line 1817, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:106214) 
File "parser.pxi", line 1721, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:105213) 
File "parser.pxi", line 1122, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:100163) 
File "parser.pxi", line 580, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:94286) 
File "parser.pxi", line 690, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:95722) 
File "parser.pxi", line 618, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:94754) 
IOError: Error reading file 'https://www.youtube.com/results?search_query=titanic+movie+trailer': failed to load external entity "https://www.youtube.com/results?search_query=titanic+movie+trailer" 

Интересно, что я здесь делаю неправильно поскольку я пытаюсь точно такой же способ сделать, чтобы анализировать информацию с других веб-сайтов, и тогда она работала.

Ваша помощь будет принята с благодарностью! Спасибо!

ответ

3

SSL/TLS is not supported by libxml2. Use Python's urllib2 instead.

Если попробовать любой URL с http://<blah>.<blah> вы не будете иметь проблемы, но HTTPS не поддерживается здесь. Также возникают проблемы с перенаправлением.

Попробуйте

from urllib2 import urlopen 
import lxml.html 
tree = lxml.html.parse(urlopen('https://google.com')) 

Для получения дополнительной информации см this


Решение

Ну есть обходной путь. Попробуйте селен, и если вы не хотите, чтобы пользовательский интерфейс запускал селен в режиме безглавых. Хорошо работает, я попробовал это сам.

+0

Thanks @ iec2011007! Это то, что я искал. – alekscp

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

  • Нет связанных вопросов^_^