LINUX.ORG.RU

Кто из нас упоролся - я или lxml?

 , ,


0

1

Пишу парсер одного html-сайта. Вот код:

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
from urllib.request import urlopen
from lxml import etree

html = urlopen("http://google.com").read() # гугл, например.
html = html.decode("cp1251").encode("utf-8")
parser = etree.HTMLParser()
tree = etree.parse(html, parser)
print(u"Этот текст никогда не выведется.")

Из исходника должно быть понятно, что текст «Этот текст никогда не выведется.» никогда не выведется. Причём исходники самого сайта выводятся. Весь код после «tree = etree.parse(html, parser)» игнорируется полностью. Покажите мне кто-нибудь, где я дурак?


Прокрути повыше, там трейсбек будет:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    tree = etree.parse(html, parser)
  File "lxml.etree.pyx", line 3210, in lxml.etree.parse (src/lxml/lxml.etree.c:69126)
  File "parser.pxi", line 1748, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:101237)
  File "parser.pxi", line 1774, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:101501)
  File "parser.pxi", line 1678, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:100536)
  File "parser.pxi", line 1110, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:95988)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:90446)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:91632)
  File "parser.pxi", line 620, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:90893)
OSError: Error reading file '<!doctype html><html itemscope="" itemtype="http://schema.org/WebP

Первый аргумент etree.parse должен быть файлом, а не строкой в общем.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

Oh, SHI~... У меня просто терминал выше не прокручивает. Даже исходников нет. И в файл выхлоп перенаправить не получилось. Спасибо за помощь, добрый человек!

kosc ()
Ответ на: комментарий от baverman

для девочек

Но я кун...

не осилили xpath

А что там осиливать? Просто я придерживаюсь принципа, если есть готовое решение, то зачем городить свои велосипеды.

z00ke ()
Ответ на: комментарий от anonymous

bs4 вроде как умеет lxml в бэкенде

Прикольно, буду знать.

baverman ★★★ ()
Ответ на: комментарий от z00ke

Просто я придерживаюсь принципа, если есть готовое решение, то зачем городить свои велосипеды.

Ну так xpath и есть готовое решение. Все остальное — это попытки сделать урезанный сахар.

baverman ★★★ ()
Ответ на: комментарий от anonymous

Олсо, urlopen заменить на requests.

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

kosc ()
Ответ на: комментарий от baverman

Это ересь. lxml может в заголовки.

А вот у меня почему-то не получалось. Правда, сайт был другой, не google. Возможно, там траблы с заголовками просто. Так что можно и подстраховаться - хуже не будет.

kosc ()
Ответ на: комментарий от kosc

Возможно, там траблы с заголовками просто.

Да, иногда бывает, но тогда encoding лучше передать в parse.

baverman ★★★ ()
Ответ на: комментарий от menangen

Сначала сам думал про Scrapy, но хочется хардкору (регекспы не предлагать, хотя... )

kosc ()
Ответ на: комментарий от kosc

Из-за одной функции ставить ещё одну библиотеку?

Что значит ставить? Почему она еще не стоит?

anonymous ()
Ответ на: комментарий от anonymous

Потому что неделю назад менял HDD на ноуте, всё ставил по новой. Нужно будет делать много POST/GET/PUT/DELETE-запросов - обязательно поставлю. Но ради получения html-кода одной страницы - не нужно.

kosc ()
Ответ на: комментарий от menangen

он на базе twisted

Только поэтому уже можно не брать.

baverman ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.