Python: извлечение определенных данных с помощью парсера html

Я начал использовать HTMLParser в Python для извлечения данных с веб-сайта. Я получаю все, что хотел, кроме текста внутри двух тегов HTML. Вот пример тега HTML:

<a href="http://wold.livingsources.org/vocabulary/1" title="Swahili" class="Vocabulary">Swahili</a>

Есть и другие теги, начинающиеся с . У них другие атрибуты и значения и поэтому я не хочу иметь их данные:

<a href="http://wold.livingsources.org/contributor#schadebergthilo" title="Thilo Schadeberg" class="Contributor">Thilo Schadeberg</a>

Тег является встроенным тегом в таблице. Я не знаю, имеет ли это какое-то значение между другими тегами. Мне нужна только информация в некоторых тегах с именем «a» с атрибутом class = «Vocabulary», и мне нужны данные внутри тега, в примере это будет «суахили». Итак, что я сделал:

class AllLanguages(HTMLParser):
    '''
    classdocs
    '''
    #counter for the languages
    #countLanguages = 0
    def __init__(self):
        HTMLParser.__init__(self)
        self.inLink = False
        self.dataArray = []
        self.countLanguages = 0
        self.lasttag = None
        self.lastname = None
        self.lastvalue = None
        #self.text = ""


    def handle_starttag(self, tag, attr):
        #print "Encountered a start tag:", tag      
        if tag == 'a':
            for name, value in attr:
                if name == 'class' and value == 'Vocabulary':
                    self.countLanguages += 1
                    self.inLink = True
                    self.lasttag = tag
                    #self.lastname = name
                    #self.lastvalue = value
                    print self.lasttag
                    #print self.lastname
                    #print self.lastvalue
                    #return tag
                    print self.countLanguages




    def handle_endtag(self, tag):
        if tag == "a":
            self.inlink = False
            #print "".join(self.data)

    def handle_data(self, data):
        if self.lasttag == 'a' and self.inLink and data.strip():
            #self.dataArray.append(data)
            #
            print data

Программа печатает все данные, включенные в тег, но мне нужны только те, которые включены в тег с правильными атрибутами. Как мне получить эти конкретные данные?


person IssnKissn    schedule 27.05.2013    source источник


Ответы (2)


Похоже, вы забыли установить self.inLink = False в handle_starttag по умолчанию:

from HTMLParser import HTMLParser


class AllLanguages(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.inLink = False
        self.dataArray = []
        self.countLanguages = 0
        self.lasttag = None
        self.lastname = None
        self.lastvalue = None

    def handle_starttag(self, tag, attrs):
        self.inLink = False
        if tag == 'a':
            for name, value in attrs:
                if name == 'class' and value == 'Vocabulary':
                    self.countLanguages += 1
                    self.inLink = True
                    self.lasttag = tag

    def handle_endtag(self, tag):
        if tag == "a":
            self.inlink = False

    def handle_data(self, data):
        if self.lasttag == 'a' and self.inLink and data.strip():
            print data


parser = AllLanguages()
parser.feed("""
<html>
<head><title>Test</title></head>
<body>
<a href="http://wold.livingsources.org/vocabulary/1" title="Swahili" class="Vocabulary">Swahili</a>
<a href="http://wold.livingsources.org/contributor#schadebergthilo" title="Thilo Schadeberg" class="Contributor">Thilo Schadeberg</a>
<a href="http://wold.livingsources.org/vocabulary/2" title="English" class="Vocabulary">English</a>
<a href="http://wold.livingsources.org/vocabulary/2" title="Russian" class="Vocabulary">Russian</a>
</body>
</html>""")

печатает:

Swahili
English
Russian

Также взгляните на:

Надеюсь, это поможет.

person alecxe    schedule 27.05.2013
comment
Большое спасибо. Я ожидал, что он будет маленьким ;). Я тоже пробую BeautifulSoup, и это тоже отлично работает. Еще раз спасибо за помощь. - person IssnKissn; 28.05.2013
comment
Пожалуйста. Подумайте о том, чтобы принять ответ, если он был полезен, спасибо! - person alecxe; 28.05.2013
comment
У вас есть рекомендации по использованию специального парсера? Мне нужны данные html-файла и я хочу записать их в xml-файл. Какой из них вы бы использовали? Или в чем преимущества одного из парсеров? - person IssnKissn; 28.05.2013
comment
Ну, Beautifulspoup и lxml — достойные парсеры html. lxml известен своей скоростью, BeautifulSoup довольно удобен, но не поддерживает выражения xpath. Подробнее: blog.ianbicking.org/2008/03/ 30/python-html-parser-performance, заголовок stackoverflow.com/questions/3577641/, stackoverflow.com/questions/6494199/. - person alecxe; 28.05.2013
comment
Ну, мне нужно разобрать много данных, поэтому BeautifulSoup работает довольно медленно. Но думаю попробовать lxml. Большое спасибо - person IssnKissn; 28.05.2013

Вы можете попробовать HTQL (http://htql.net). Запрос для:

«теги с именем «a» с атрибутом class = «Vocabulary», и мне нужны данные внутри тега»

is:

<a (class='Vocabulary')>:tx 

Код на питоне примерно такой:

import htql
a=htql.query(page, "<a (class='Vocabulary')>:tx")
print(a)
person seagulf    schedule 27.05.2013