Форум сайта python.su
Добрый день, уважаемые форумчане.
Я совсем новый человек в питоне, поэтому будьте снисходительны, пожалуйста. Необходимо вытянуть из яндекс.маркета свойства товара, которые содержатся в одной из таблиц на странице. Почитав инет я решил отказаться от идеи штурмовать регулярные выражения и воспользоваться 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
Офлайн
Я немного использовал КрасивыйСуп и использовал следующий метод
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)
Офлайн
Выкинуть суп. Использовать lxml.html + xpath
Офлайн
Спасибо. Обратился к html5lib и lxml с xpath.
Возникла проблема с ней. вынуть таблицу из недр html удалось в виде набора строк таблицы:
<tr><th class="b-properties__label b-properties__label-title"><span>Расположение</span></th><td class="b-properties__value">отдельно стоящий</td></tr>
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
Отредактировано SoWar (Янв. 25, 2013 19:02:53)
Офлайн
for tr in doc.xpath('..../tr'): name = tr.xpath('th/text()')[0] value = tr.xpath('td/text()')[0]
Офлайн
SoWarBeautifulSoup по-моему очень удобная штука. Здесь же ошибка в том, что вместо table = soup.table нужно использовать table = soup.find_All('table'), потом прогонять цикл по всем полученным значениям
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
Офлайн