Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 10, 2012 14:55:33

damlex
От:
Зарегистрирован: 2012-02-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг html

Задача пропарсить страницу 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
Подскажите, что не так и как убрать html теги. Пробовал text=True не работает.Помогите очень надо.



Отредактировано (Фев. 10, 2012 14:58:05)

Офлайн

#2 Фев. 10, 2012 18:26:25

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

Python парсинг html

Задача пропарсить страницу 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



Офлайн

#3 Фев. 10, 2012 23:03:17

damlex
От:
Зарегистрирован: 2012-02-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг html

damlex
Задача пропарсить страницу html и получить данные о полях боя, для парсинга использую
Дело не в инструменте для парсинга, как мне кажется проблема заключается в самой странице. Попробую объяснить в чем вся соль.Я использую браузер Google Chome.За ходим на страницу
baseurl='http://us.battle.net/wow/eu/character/'+servername+'/'+name+ '/statistic#21:153'
, по ссылке нет ничего такого, это wow armory(кто играет поймет).Нажимаем кнопку “F12” и смотрим из каких блоков состоит страничка, но если нажать правую кнопку мыши->Просмотр кода страницы мы этих блоков не увидим. Может проблема в этом, т.е. парсер тоже не видит.Кому не сложно гляньте я в html не силен.



Офлайн

#4 Фев. 11, 2012 05:25:50

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

Python парсинг html

Приведи ссылку на конкретный сервер (его страницу).
Попробуй в FireFox + FireBug (http://ru.wikipedia.org/wiki/Firebug) открыть нужную тебе страницу и проанализировать содержимое.



Офлайн

#5 Фев. 11, 2012 10:48:53

damlex
От:
Зарегистрирован: 2012-02-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг html

Psixo
Приведи ссылку на конкретный сервер (его страницу).
Ссылка http://us.battle.net/wow/en/character/magtheridon/Idiotbox/statistic#21:153
Установил FireBug lite для Google Chome и наблюдаю такую же картину в console при запросе GET /wow/en/character/magtheridon/Idiotbox/statistic/153 все блоки(данные что нужны есть), а на вкладке html ничего.
Может быть данные скрывают каким-то скриптом или данные выводятся скриптом поэтому их в html и не видно.



Отредактировано (Фев. 11, 2012 11:01:29)

Офлайн

#6 Фев. 11, 2012 18:31:18

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

Python парсинг html

http://us.battle.net/wow/en/character/magtheridon/Idiotbox/statistic/153 (см. код страницы, xhtml) Что мешает его распарсить? Или я что-то не так понимаю?



Отредактировано (Фев. 11, 2012 18:33:05)

Офлайн

#7 Фев. 11, 2012 18:36:40

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

Python парсинг html

<li id="cat-153" class="table" style="display: none">
Убери style=“display: none” через FireBug и все увидишь на странице в браузере. В общем не понимаю в чем у тебя сейчас проблема.



Офлайн

#8 Фев. 11, 2012 20:52:00

damlex
От:
Зарегистрирован: 2012-02-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг html

Psixo
Спасибо за помощь.Теперь проблем я думаю не возникнет.



Офлайн

#9 Фев. 13, 2012 12:22:07

damlex
От:
Зарегистрирован: 2012-02-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг html

Чтобы не создавать еще одну тему спрошу здесь.Как и ожидалось проблем с парсингом не появилось.Но возник один вопрос который я не могу решить.
После парсинга страницы получаем такой результат.

[<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>]
Каким образом назначить переменные для этих данных, т.е. например alterak=29, которая подразумевает вот это <dt>Победы в Альтеракской долине</dt><dd> 29. Почему не парсится вся страница, а выводятся только победы - количество сражений игнорируется.



Отредактировано (Фев. 13, 2012 12:26:03)

Офлайн

#10 Дек. 30, 2024 09:06:21

bevis0405
Зарегистрирован: 2024-12-30
Сообщения: 3
Репутация: +  -3  -
Профиль   Отправить e-mail  

Python парсинг html

The world of abgerny is unlike anything I’ve seen. Its uniqueness and complexity add a depth that keeps me completely engaged.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version