Найти - Пользователи
Полная версия: Beautiful soup не парсит страницу
Начало » Python для новичков » Beautiful soup не парсит страницу
1
SoWar
Добрый день, уважаемые форумчане.

Я совсем новый человек в питоне, поэтому будьте снисходительны, пожалуйста. Необходимо вытянуть из яндекс.маркета свойства товара, которые содержатся в одной из таблиц на странице. Почитав инет я решил отказаться от идеи штурмовать регулярные выражения и воспользоваться 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
Frog-king
Я немного использовал КрасивыйСуп и использовал следующий метод
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
пример в коде: table = soup.findAll( “table”, attrs={“id”: “property”})
мне кажется для большинства задач этот метод подходить )))
lorien
Выкинуть суп. Использовать lxml.html + xpath
SoWar
Спасибо. Обратился к 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. В любом случае текст не читаем. Как его декодировать в человеческий вариант?
lorien
for tr in doc.xpath('..../tr'):
    name = tr.xpath('th/text()')[0]
    value = tr.xpath('td/text()')[0]

Для работы с lxml html5lib не нужен. Вообще не совсем понимаю, зачем народ юзает эту либу (html5lib).
maratvildan
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'), потом прогонять цикл по всем полученным значениям
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB