LINUX.ORG.RU

Помогите с lxml


0

1

Есть файлик xml, пытаюсь вытащить содержимое href из тегов a, но в ответ тишина.
Если все тоже самое повторить с html, то все отлично. Подскажите куда копать?


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, lxml
from lxml import html, cssselect

page = urllib.urlopen('http://www.site.com/rss.xml')
doc = lxml.html.document_fromstring(page.read())

for link in doc.cssselect('div.entry a'):
    print link.get('href')



Последнее исправление: one_quaker (всего исправлений: 1)

Ответ на: комментарий от enchantner

feedparser тоже что-то не прижился. Уже склоняюсь к мнению что проще заюзать регулярки и не заморачиваться с чужими великами.

И да, путь к тегу a я указывал правильный

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

И да, путь к тегу a я указывал правильный

Чудес же не бывает.

baverman ★★★
()

Давай пример документа.

baverman ★★★
()

Скорее всего проблема с неймспейсами.

baverman ★★★
()
Ответ на: комментарий от trashymichael
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2, os, re


page = 'http://www.lostfilm.tv/'
xml = 'rssdd.xml'

headers = {
'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1',
'Accept' : '*/*',
'Accept-Language' : 'ru,en-us;q=0.7,en;q=0.3',
'Accept-Charset' : 'UTF-8,*'
}

def getFile(file_name, file_mode, base_url):
    from urllib2 import Request, urlopen, URLError, HTTPError

    #create the url and the request
    url = base_url + file_name
    req = Request(url, None, headers)

    # Open the url
    try:
        f = urlopen(req)
        print 'downloading ' + url

        # Open our local file for writing
        local_file = open(file_name, 'w' + file_mode)
        #Write to our local file
        local_file.write(f.read())
        local_file.close()

    #handle errors
    except HTTPError, e:
        print 'HTTP Error:', e.code, url
    except URLError, e:
        print 'URL Error:', e.reason, url

getFile(xml, 'w', page)

list = []

f = open(xml, 'r')
list = f.readlines()
f.close()

for i in xrange(len(list)):
    list[i] = list[i].replace('&', '&')
    if list[i].find('torrent') != -1:
        link_re = re.compile(r'<*/*\w*>|\n')
        link = link_re.sub('', list[i])
        print link
        name_re = re.compile(r'&\w+.\w+.\w+')
        tags = name_re.findall(link)
        print tags

Смущает меня бред в самом конце, чет никак не додумаю как сделать регулярку только по конкретным сериалам и по качеству.

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

что у тебя не работало? xpath не искался? делать парсер за тебя я небуду, ты уже и сам его сделал, но утверждать «xpath не работал для лостфильма» как минимум глупо, ты же сам понимаешь

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

Смотри код в шапке, было практически так же только вместо csselect был xpath, запуск скрипта выдавал тишину.

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

div.entry a это не xpath' хотя я чайник

возможно, помогла бы ОТЛАДКА?

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

Блин, ну я же тоже ничего не придумываю. xpath не работает, csselect тоже, тоже самое на html работает отлично, а в xml нет. Почему я еще не догнал.

Насчет того что уже наваял регулярками, я запутался что делать дальше))

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

Там же вроде html внутри CDATA, это просто текст, из него нужно сделать еще один dom. Вот так вот работает:

#!/usr/bin/env python
from lxml import etree as ET
from lxml import html
import urllib2

if __name__ == '__main__':
    rssdom = ET.fromstring(urllib2.urlopen("http://www.lostfilm.tv/rssdd.xml").read())
    descriptions = rssdom.xpath('channel/item/description/text()')
    for description in descriptions:
        for links in  html.document_fromstring(description).iterlinks():
            for link in links:
                if getattr(link,'tag','') == 'a':
                    print link.attrib['href']

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