Найти - Пользователи
Полная версия: Python парсинг html
Начало » Python для новичков » Python парсинг html
1
damlex
Задача пропарсить страницу 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 не работает.Помогите очень надо.
Psixo
Задача пропарсить страницу 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
damlex
Задача пропарсить страницу html и получить данные о полях боя, для парсинга использую
Дело не в инструменте для парсинга, как мне кажется проблема заключается в самой странице. Попробую объяснить в чем вся соль.Я использую браузер Google Chome.За ходим на страницу
baseurl='http://us.battle.net/wow/eu/character/'+servername+'/'+name+ '/statistic#21:153'
, по ссылке нет ничего такого, это wow armory(кто играет поймет).Нажимаем кнопку “F12” и смотрим из каких блоков состоит страничка, но если нажать правую кнопку мыши->Просмотр кода страницы мы этих блоков не увидим. Может проблема в этом, т.е. парсер тоже не видит.Кому не сложно гляньте я в html не силен.
Psixo
Приведи ссылку на конкретный сервер (его страницу).
Попробуй в FireFox + FireBug (http://ru.wikipedia.org/wiki/Firebug) открыть нужную тебе страницу и проанализировать содержимое.
damlex
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 и не видно.
Psixo
http://us.battle.net/wow/en/character/magtheridon/Idiotbox/statistic/153 (см. код страницы, xhtml) Что мешает его распарсить? Или я что-то не так понимаю?
Psixo
<li id="cat-153" class="table" style="display: none">
Убери style=“display: none” через FireBug и все увидишь на странице в браузере. В общем не понимаю в чем у тебя сейчас проблема.
damlex
Psixo
Спасибо за помощь.Теперь проблем я думаю не возникнет.
damlex
Чтобы не создавать еще одну тему спрошу здесь.Как и ожидалось проблем с парсингом не появилось.Но возник один вопрос который я не могу решить.
После парсинга страницы получаем такой результат.
[<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. Почему не парсится вся страница, а выводятся только победы - количество сражений игнорируется.
bevis0405
The world of abgerny is unlike anything I’ve seen. Its uniqueness and complexity add a depth that keeps me completely engaged.
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