LINUX.ORG.RU

Чем в python-е попарсить html


0

3

В ответ на запрос к сайту, пришла страничка, чем её попарсить, дабы выбрать запись из div-a, т.е найти нужный мне div(id его известен) и распарсить уже этот div? Желательно нативными средствами python(использование библиотек что с питоном из коробки), не хочется ставить ничего лишнего.

★★★★★

Хз насчет стандартной либы, но я вот на днях заюзал lxml.etree.HTML и мне понравилось

dizza ★★★★★
()

Ну вообще есть BeautifulSoup, но это если доустанавливать. Вроде бы Mechanize тоже есть под питон. По поводу нативных средств не подскажу. Сам выдергивал одно значение из простенькой html'ки split'ами.
Что-то в последнее время зачастили подобные вопросы, или мне кажется.

winlook38 ★★
()
Ответ на: комментарий от winlook38

зачастили, да, но мне тоже интересно, чем попарсить.
причем не одну страницу, а весь сайт.
может кто даст дельный совет, что есть из готового

wxw ★★★★★
()
Ответ на: комментарий от wxw

Выше указаны несколько вариантов. Насчет парсинга html средсвами для работы с xml не уверен, всегда ли оно распарсит html. Вроде бы BeautifulSoup создавался именно для парсинга html, который может быть невалидный xml'ом. Еще XPath интересно тоже. Его я в питоне не использовал, но помогал товарищу-php'шнику парсить курс валют с помощью XPath - самый простой и короткий код, наверное.

winlook38 ★★
()

Лично я для тех же целей использую BeatifulSoup. Есть и другие варианты, но я уже выбрал этот.

gnunixon ★★★
()

т.е найти нужный мне div(id его известен)

Предположим, что у нас есть такая простенькая страница:

<html>
<body>
    <div id="foo">text inside foo</div>
    <div id="bar">text inside bar</div>
</body>
</html>

И нужно достать содержимое div id =«foo». Т.е. «text inside foo»

Вариант 1 - Используя только стандартную библиотеку, а именно HTMLParser

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.in_div = False
     
    def handle_starttag(self, tag, attr):
        if tag == 'div':
            for name, value in attr:
                if name =='id' and value=='foo':
                    self.in_div = True
    
    def handle_data(self, data):
        if self.in_div:
            print data
    
    def handle_endtag(self, tag):
        self.in_div = False
    
parser = MyHTMLParser()
data = open('tmp.html').read()
parser.feed(data)

Вариант №2 - BeautifulSoup (ее надо установить в систему). Мне очень нравится именно эта либа:

from BeautifulSoup import BeautifulSoup as Soup

data = open('tmp.html').read()
soup = Soup(data)

div = soup.find('div', {'id':'foo'})
print div.text

Вариант №3: lxml (аналогично, требует установки в систему)

from lxml import html

data = open('tmp.html').read()
tree = html.fromstring(data)

div = tree.xpath('//div[@id="foo"]')
print div[0].text

Еще есть обертка над lxml - называется leaf (тоже надо отдельно установить в систему):

import leaf

data = open('tmp.html').read()
doc = leaf.parse(data)

div = doc("div#foo")
print div[0].text

Что касается вопроса wxw: «мне тоже интересно, чем попарсить. причем не одну страницу, а весь сайт.» - то есто множество библиотек: scrapy, Grab, mechanize.

beka
()
Ответ на: комментарий от beka

Благодарствую, за хорошую подборку примерчиков :)

xterro ★★★★★
() автор топика

BeautifulSoup тормоз, если есть возможность заюзать lxml, то юзай именно его.
Не слышал про обертку leaf к нему, но не вижу причин ее использовать, lxml прекрасно может в css selector'ы.

rival ★★
()
Ответ на: комментарий от beka

благодарю за совет
scrapy оказалась замечательная штука, хоть и не люблю педон

wxw ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.