Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2013 20:43:53

SoWar
Зарегистрирован: 2013-01-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Beautiful soup не парсит страницу

Добрый день, уважаемые форумчане.

Я совсем новый человек в питоне, поэтому будьте снисходительны, пожалуйста. Необходимо вытянуть из яндекс.маркета свойства товара, которые содержатся в одной из таблиц на странице. Почитав инет я решил отказаться от идеи штурмовать регулярные выражения и воспользоваться Beautiful soup. Делаю вроде все как в примерах пишут, но кол-во тэгов, которые обнаруживает мыло меньше, чем есть на странице. Для теста хотел вытянуть <table>, но выдается только первая таблица. В чём я не прав, подскажите, пожалуйста. Питон 2.7.3. в сборке pythonxy.

import urllib2
from bs4 import BeautifulSoup
url = 'http://market.yandex.ru/model-spec.xml?modelid=4920498&hid=90595'
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0', 'Accept-Charset': 'utf-8' })
page = urllib2.urlopen(req).read()
soup = BeautifulSoup(page)
#print soup.prettify()
table = soup.table
print table

Офлайн

#2 Янв. 23, 2013 21:24:05

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Beautiful soup не парсит страницу

Я немного использовал КрасивыйСуп и использовал следующий метод
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
пример в коде: table = soup.findAll( “table”, attrs={“id”: “property”})
мне кажется для большинства задач этот метод подходить )))

Отредактировано Frog-king (Янв. 23, 2013 21:26:08)

Офлайн

#3 Янв. 23, 2013 22:31:04

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Beautiful soup не парсит страницу

Выкинуть суп. Использовать lxml.html + xpath

Офлайн

#4 Янв. 25, 2013 18:49:34

SoWar
Зарегистрирован: 2013-01-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Beautiful soup не парсит страницу

Спасибо. Обратился к html5lib и lxml с xpath.
Возникла проблема с ней. вынуть таблицу из недр html удалось в виде набора строк таблицы:

<tr><th class="b-properties__label b-properties__label-title"><span>Расположение</span></th><td class="b-properties__value">отдельно стоящий</td></tr>
Надо вынуть парой: параметр, значение. Как это сделать с помощью парсера и xpath я не додумался. Пришло в голову только конвертация этих элементов дерева в строку и обработка регулярными выражениями. Возможно я что-то упустил. Помогите советом, пожалуйста.
Исходный код, достающий строки таблицы выгдялит так:
import html5lib
from html5lib import treebuilders
from lxml import etree
import re
f = open('model-spec.xml.htm').read()
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("lxml"), namespaceHTMLElements=False)
doc = parser.parse(f)
val = doc.xpath('/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr')
for sym in val:
    tr = re.findall("<span>(.*?)</span>",etree.tostring(sym))
    print tr

И кстати, в консоль выводится кодированный текст. В зависимости от функции, примененной для преобразования в строку элемента дерева tostring или tounicode. В любом случае текст не читаем. Как его декодировать в человеческий вариант?

Отредактировано SoWar (Янв. 25, 2013 19:02:53)

Офлайн

#5 Янв. 26, 2013 14:41:15

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Beautiful soup не парсит страницу

for tr in doc.xpath('..../tr'):
    name = tr.xpath('th/text()')[0]
    value = tr.xpath('td/text()')[0]

Для работы с lxml html5lib не нужен. Вообще не совсем понимаю, зачем народ юзает эту либу (html5lib).

Офлайн

#6 Сен. 12, 2013 15:01:49

maratvildan
Зарегистрирован: 2013-09-12
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Beautiful soup не парсит страницу

SoWar
import urllib2
from bs4 import BeautifulSoup
url = 'http://market.yandex.ru/model-spec.xml?modelid=4920498&hid=90595'
req = urllib2.Request(url, headers={ ‘User-Agent’: ‘Mozilla/5.0’, ‘Accept-Charset’: ‘utf-8’ })
page = urllib2.urlopen(req).read()
soup = BeautifulSoup(page)
#print soup.prettify()
table = soup.table
print table
BeautifulSoup по-моему очень удобная штука. Здесь же ошибка в том, что вместо table = soup.table нужно использовать table = soup.find_All('table'), потом прогонять цикл по всем полученным значениям

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version