LINUX.ORG.RU

[python][lxml] Помогите правильно задать значение cssselect()

 ,


0

1

Если в предпоследней строчке задам 'td a' вместо того что там есть то он всё показывает, но если я добавлю 'tr'(и далее) то ничего не печатает.

#!/usr/bin/python
from urllib.parse import urlencode
from urllib.request import urlopen
from lxml.html import fromstring, cssselect

SEARCH_WORD = 'na' #input('Enter manga name: ').replace(' ', '+')
SEARCH_URL = 'http://www.mangafox.com/search.php?name=' + SEARCH_WORD

RAW_HTML = urlopen(SEARCH_URL)
STR_HTML = RAW_HTML.read().decode('utf-8')
HTML = fromstring(STR_HTML)

for a in HTML.cssselect('table.listing tbody tr td a'):
    print(a.text)

Потом, если это возможно, мне бы хотелось пролистать в одном for сразу HTML.cssselect('a.manga_close') и HTML.cssselect('a.manga_open') за раз и в том порядке в котором они появляются на страницу. Да это тоже самое что и выше, но мне интересно как это сделать.


в принципе можно все сохрынить в list а потом рассортировать, но мне кажется это не очень эффективно

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

из файербага вставлять и он у меня не завелся

Файрбаг всегда добавляет фиктивный tbody, поэтому его выражения не работают.

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

Файрбаг всегда добавляет фиктивный tbody, поэтому его выражения не работают.

мое вырожение лица прям как на твоей аватарке. теперь все стало ясно.

Andaril
() автор топика

>RAW_HTML = urlopen(SEARCH_URL)

В верхнем регистре рекомендуется объявлять только константы, а не просто переменные. Это, конечно, не правило, но так лучше делать.

SEARCH_URL = 'http://www.mangafox.com/search.php?name=' + SEARCH_WORD

Хотя в данном случае никакой разницы не будет, но лучше использовать string formatting - это будет хорошая привычка. Потому что в случае нескольких + проседает производительность, т.к. интерпретатор при каждом сложении заново определяет размер новой строки, выделяет память и заморачивается с внутренними структурами.

Поэтому, если складывать три куска в строку, лучше таки использовать «%s..» % (...)

Кстати, в этой строчке лучше urlencode применять, т.к. надо экранировать не-ascii символы в запросе. То, что сейчас у тебя их может не быть, не значит, что в будущем оно неожиданно не сломается.

STR_HTML = RAW_HTML.read().decode('utf-8')

Насчёт кодировки html-я тоже стоит задуматься. Мало ли что.

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

Потому что в случае нескольких + проседает производительность

Лютое 4.2

import time

N = 1000000

s1 = 'dsdfkjasf'
s2 = 'sadfsdf'
s3 = 'ggggsdfgasg'

i = N
t = time.time()
while i > 0:
    i -= 1
    s = 'string' + s1 + s2 + s3

print time.time() - t

i = N
t = time.time()
while i > 0:
    i -= 1
    s = 'string%s%s%s' % (s1, s2, s3)

print time.time() - t
2.85370898247
3.42323517799

По остальным пунктам полностью согласен, но надо учесть, что ТС пишет на скорую руку башеподобный скрипт, имеющего несколько опосредованное отношение к программированию, поэтому грязь вполне уместна.

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

Насчёт кодировки html-я тоже стоит задуматься. Мало ли что.

на сайте чарсет UTF-8 или я что неправильно понял?

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

на сайте чарсет UTF-8 или я что неправильно понял?

lxml может сам определить кодировку по мета информации.

baverman ★★★
()

вот еще вопрос

по адресу http://www.mangafox.com/manga/naruto/

for a in HTML.cssselect('table#listing tr td'):
        print(a.text)
<tr>
              <td>
                <a class="edit" title="Request Edit" href="javascript:popUp('/edit/chapter.php?chapter_id=131953',450,400);">edit</a>
                <a title="Volume 56" class="ch" href="/manga/naruto/v56/c536/1.html">Naruto 536</a>: Naruto Goes to War!                              </td>
              <td>MangaStream</td>
              <td>n/a</td>
              <td class="no">Apr 21, 2011</td>
            </tr>

он печатает все кроме первого td(Naruto Goes to War!). Как его достать?

Andaril
() автор топика
Ответ на: комментарий от Andaril
for r in root.xpath("//table[@id='listing']//tr/td[1]"):
    print list(r.itertext())[-1].strip()
baverman ★★★
()
Ответ на: комментарий от Andaril

Или даже так:

for r in root.xpath("//table[@id='listing']//tr/td[1]/a[2]"):
    print r.tail
baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.