#!/usr/bin/env python3
import lxml.html
def parse_tables(tables):
sect1, sect2, sect3 = [], [], []
state = 'before'
for t in tables:
if state == 'before':
if search_section_type(t) == 'ТУРПАКЕТЫ':
state = 'section1'
elif state == 'section1':
if search_section_type(t) == 'БИЛЕТЫ':
state = 'section2'
elif is_valid_table1(t):
sect1.append(get_data_table1(t))
elif is_valid_table2(t):
sect1.append(get_data_table2(t))
elif state == 'section2':
if search_section_type(t) == 'ОТЕЛИ':
state = 'section3'
elif is_valid_table1(t):
sect2.append(get_data_table1(t))
elif is_valid_table2(t):
sect2.append(get_data_table2(t))
elif state == 'section3':
if is_valid_table1(t):
sect3.append(get_data_table1(t))
elif is_valid_table2(t):
sect3.append(get_data_table2(t))
return sect1, sect2, sect3
def search_section_type(t):
lst = t.xpath('.//td[@class = "type_of_package"]/text()')
if lst:
return lst[0]
def is_valid_table1(t):
return 'style' in t.attrib
def is_valid_table2(t):
return ('class' in t.attrib and
'hide_sc_info_table' in
t.attrib.get('class', ''))
def get_data_table1(t):
out = (
t.xpath('.//b[@class]/text()')[0],
t.xpath('.//strong/text()')[0],
)
out = tuple(map(str.strip, out))
return out
def get_data_table2(t):
out = (
t.xpath('.//tr/td[2]/text()')[0],
)
out = tuple(map(str.strip, out))
return out
url = 'http://tourdom.tv/happy-hour/schastlivyj-chas/'
#doc = lxml.html.parse(url)
doc = lxml.html.parse('file.html')
#print(doc)
alltables = doc.xpath('//table')
#print(alltables)
sect1, sect2, sect3 = parse_tables(alltables)
print(sect1)
print(len(sect1))
print(sect2)
print(len(sect2))
print(sect3)
print(len(sect3))
[('На 11.07.2014', 'Болгария, Солнечный берег,'), ('Туи',), ('На 18.07.2014', 'Кипр, Протарас,'), ('Лабиринт',), ('На 12.07.2014', 'Греция, о.Родос,'), ('Тройка',), ('На 08.07.2014', 'Испания, Коста-Брава,'), ('Лабиринт',), ('На 12.07.2014', 'Италия, о.Сардиния,'), ('Пак груп',), ('На 10.07.2014', 'Чехия, Прага,'), ('Туи',), ('На 08.07.2014', 'Турция, Алания,'), ('Санмар',), ('На 22.07.2014', 'Египет, Шарм-Эль-Шейх,'), ('Brisco',), ('На 18.07.2014', 'Хорватия, Цавтат,'), ('ПАКС',), ('На 16.07.2014', 'Черногория, Шушань,'), ('Библио Глобус',), ('На 27.07.2014', 'Тунис, Набель,'), ('Библио Глобус',)]
22
[('На 11.09.2014', 'Москва – Лондон – Москва,'), ('Москва, а/п Домодедово',), ('На 07.07.2014', 'Москва – Карловы Вары – Москва,'), ('Москва, а/п Шереметьево',)]
4
[('На 11.09.2014', 'Великобритания, Лондон,'), ('',)]
2
[guest@localhost xptours]$d54wvzc+i5zirs
покажите как вы на пример извлечёте даты только на турпакеты?
Общий способ - использование конечного автомата. Это подходит для любых страниц (и не только страниц).
john123
Правильные только для турпакетов вот:
Не, выдаёт не всё.
#!/usr/bin/env python3
import lxml.html
url = 'http://tourdom.tv/happy-hour/schastlivyj-chas/'
#doc = lxml.html.parse(url)
doc = lxml.html.parse('file.html')
#print(doc)
tables = doc.xpath("//*[contains(@class, 'entry-content')]/table[contains(., 'БИЛЕТЫ')]/preceding::table[not(contains(., 'ТУРПАКЕТЫ')) and not(@class)]")
print(tables, len(tables))
dates = doc.xpath("//*[contains(@class, 'entry-content')]/table[contains(., 'БИЛЕТЫ')]/preceding::table[not(contains(., 'ТУРПАКЕТЫ')) and not(@class)]//td[@class='width_first_td_from_table']/b")
print(dates, len(dates))
[guest@localhost xptours]$ ./xptours_inc.py
[<Element table at 0xb721eb9c>, <Element table at 0xb721ebcc>, <Element table at 0xb721ebfc>, <Element table at 0xb721ec2c>, <Element table at 0xb721ec5c>, <Element table at 0xb721ec8c>, <Element table at 0xb721ecbc>, <Element table at 0xb721ecec>, <Element table at 0xb721ed1c>, <Element table at 0xb721ed4c>] 10
[] 0
[guest@localhost xptours]$
10 элементов вместо 11