Форум сайта python.su
Задача пропарсить страницу html и получить данные о полях боя, для парсинга использую библиотеку Beautifulsoup.
import urllib.request
from bs4 import BeautifulSoup
from bs4.element import Comment, SoupStrainer
name='Idiotbox'
servername='magtheridon'
baseurl='http://us.battle.net/wow/eu/character/'+servername+'/'+name+ '/statistic#21:153'
urldecod=urllib.request.quote(baseurl,'/,:,#','utf-8')
url=urllib.request.urlopen(urldecod)
soup = BeautifulSoup(url)
wow_class=soup.findAll('a',{'class':'class'})
wow_race=soup.findAll('a',{'class':'race'})
dl=soup.findAll('dl',{'class':'odd'})
print(wow_class,wow_race,dl)
[<a class="class" href="/wow/en/game/class/mage">Mage</a>] [<a class="race" href="/wow/en/game/race/troll">Troll</a>] [<dl class="odd">
<dt>Total kills that grant experience or honor</dt><dd> 169,467
</dd>
</dl>, <dl class="odd">
<dt>Vanity pets owned</dt><dd> 11
</dd>
</dl>, <dl class="odd">
<dt>Total factions encountered</dt><dd> 56
</dd>
</dl>, <dl class="odd">
<dt>Most factions at Revered or higher</dt><dd> 31
</dd>
</dl>]
Process finished with exit code 0
Отредактировано (Фев. 10, 2012 14:58:05)
Офлайн
Задача пропарсить страницу html и получить данные о полях боя, для парсинга использую библиотеку Beautifulsoup.Выбран не самый эффективный инструмент. Используй lxml. ( http://lxml.de/ , http://habrahabr.ru/blogs/python/114788/ )
import StringIO
import html5lib
import lxml
import lxml.html
def ParserImages(html_text):
""" Парсер картинок (ссылок на изображения) """
# Создаем объект для парсинга
parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder("lxml"))
doc_tree = parser.parse(StringIO.StringIO(html_text))
find_img = lxml.etree.XPath(".//html:img", namespaces={"html":"http://www.w3.org/1999/xhtml"})
# Распарсиваем
img_list = []
for node in find_img(doc_tree):
src = node.get("src")
if src == None:
continue
img_list.append(src)
return img_list
def ParserForms(html_text):
""" Парсер форм на странице """
form_list = []
# Создаем объект для парсинга
parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder("lxml"))
doc_tree = parser.parse(StringIO.StringIO(html_text))
# Парсим формы
forms = []
find_form = lxml.etree.XPath(".//html:form", namespaces={"html":"http://www.w3.org/1999/xhtml"})
for node in find_form(doc_tree):
forms.append(node)
# Парсим элементы форм
find_input = lxml.etree.XPath(".//html:input", namespaces={"html":"http://www.w3.org/1999/xhtml"})
for form in forms:
""" name, action, input=['name':'value'] """
tmp_form = {}
tmp_form['name'] = form.get('name')
tmp_form['action'] = form.get('action')
tmp_form['input'] = {}
# Ищем элементы
#form_tree = parser.parse(StringIO.StringIO(lxml.etree.tostring(form)))
for node in form.findall(".//html:input", namespaces={"html":"http://www.w3.org/1999/xhtml"}):
tmp_form['input'][node.get('name')] = node.get('value')
form_list.append(tmp_form)
return form_list
Офлайн
damlexДело не в инструменте для парсинга, как мне кажется проблема заключается в самой странице. Попробую объяснить в чем вся соль.Я использую браузер Google Chome.За ходим на страницу
Задача пропарсить страницу html и получить данные о полях боя, для парсинга использую
baseurl='http://us.battle.net/wow/eu/character/'+servername+'/'+name+ '/statistic#21:153'
Офлайн
Приведи ссылку на конкретный сервер (его страницу).
Попробуй в FireFox + FireBug (http://ru.wikipedia.org/wiki/Firebug) открыть нужную тебе страницу и проанализировать содержимое.
Офлайн
PsixoСсылка http://us.battle.net/wow/en/character/magtheridon/Idiotbox/statistic#21:153
Приведи ссылку на конкретный сервер (его страницу).
Отредактировано (Фев. 11, 2012 11:01:29)
Офлайн
http://us.battle.net/wow/en/character/magtheridon/Idiotbox/statistic/153 (см. код страницы, xhtml) Что мешает его распарсить? Или я что-то не так понимаю?
Отредактировано (Фев. 11, 2012 18:33:05)
Офлайн
<li id="cat-153" class="table" style="display: none">
Офлайн
PsixoСпасибо за помощь.Теперь проблем я думаю не возникнет.
Офлайн
Чтобы не создавать еще одну тему спрошу здесь.Как и ожидалось проблем с парсингом не появилось.Но возник один вопрос который я не могу решить.
После парсинга страницы получаем такой результат.
[<dl class="odd">
<dt>Сыгранные сражения на рейтинговом поле боя</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Рейтинговое поле боя, на котором вы были чаще всего</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Выигранные сражения на рейтинговом поле боя</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Рейтинговое поле боя, на котором вы одержали больше всего побед</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Победы в Альтеракской долине</dt><dd> 29
</dd>
</dl>, <dl class="odd">
<dt>Победы в Низине Арати</dt><dd> 33
</dd>
</dl>, <dl class="odd">
<dt>Побед в Битвах за Гилнеас</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Победы на Оке Бури</dt><dd> 25
</dd>
</dl>, <dl class="odd">
<dt>Победы на Береге Древних</dt><dd> 29
</dd>
</dl>, <dl class="odd">
<dt>Побед в Двух Пиках</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Победы в Ущелье Песни Войны</dt><dd> 31
</dd>
</dl>, <dl class="odd">
<dt>Победы на Острове Завоеваний</dt><dd> 13
</dd>
</dl>, <dl class="odd">
<dt>Количество захваченных башен в Альтеракской долине</dt><dd> 4
</dd>
</dl>, <dl class="odd">
<dt>Захвачено флагов в Двух Пиках</dt><dd> <span class="empty">--</span>
</dd>
</dl>, <dl class="odd">
<dt>Количество захваченных флагов в Ущелье Песни Войны</dt><dd> 3
</dd>
</dl>]
Отредактировано (Фев. 13, 2012 12:26:03)
Офлайн
The world of abgerny is unlike anything I’ve seen. Its uniqueness and complexity add a depth that keeps me completely engaged.
Офлайн