Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 1, 2019 18:44:58

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг. таблица

получил хтмл страницы:

 import urllib.request
fp = urllib.request.urlopen("https://www.globes.co.il/news/currencycontrols/currencyhistory.asp?Currency=USD&Month=1&Year=2000")
mybytes = fp.read()
mystr = mybytes.decode("windows-1255")
fp.close()
print(mystr)

на странице имеется таблица

Как мне выташить собержимое этой таблицы??

Офлайн

#2 Авг. 1, 2019 19:17:15

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг. таблица

пробывал так

 from lxml import html
tree = html.fromstring(mystr)
table = tree.xpath('//table')
print(tree.xpath('//table'))
for row in table[0]: print(row)

получаю чтото вроде
<Element tr at 0x3742e10>
<Element tr at 0x3742d80>
<Element tr at 0x3742e40>
<Element tr at 0x3742e10>
<Element tr at 0x3742d80>
<Element tr at 0x3742e40>
<Element tr at 0x3742e10>
<Element tr at 0x3742d80>

А как получить содержимое яцеек?

Офлайн

#3 Авг. 1, 2019 21:01:58

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Парсинг. таблица

Попробуйте так:

 from lxml import html
tree = html.fromstring(mystr)
table = tree.xpath('//table/tr/td')
for row in table:
    if row.text:
        print(row.text)

Офлайн

#4 Авг. 1, 2019 21:37:31

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг. таблица

перегнал в словарь:

 tree = html.fromstring(mystr)
table = tree.xpath('//table/tr/td')
usdList = []
usdDict = {}
for row in table:
    if row.text and row.text != 'שער' and row.text != 'תאריך':
        #print(row.text)
        usdList.append(row.text)
for  i in range(0, len(usdList)-1, 2):
    usdDict[usdList[i+1]] = usdList[i]
print(usdDict)

Офлайн

#5 Авг. 2, 2019 01:23:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг. таблица

Сначала разделяешь на строки, потом из каждой строки берёшь столбцы

  
>>> import lxml.html
>>> 
>>> text = """
... <table>
... <tr><td>a</td><td>b</td></tr>
... <tr><td>c</td><td>d</td></tr>
... <tr><td>e</td><td>f</td></tr>
... </table>
... """
>>> 
>>> doc = lxml.html.fragment_fromstring(text)
>>> 
>>> out = [i.xpath('td/text()') for i in doc.xpath('//table/tr')]
>>> out
[['a', 'b'], ['c', 'd'], ['e', 'f']]
>>>
Почему не надо сразу столбцы брать - потому что в таблицах сами строки бывают разные по назначению и надо брать не все строки, а лишь некоторые. Где-то нужно провести дополнительные преобразования над строками, прежде чем брать столбцы из них. Но часто бывает так, что строки берёшь одним способом, а столбцы берёшь другим способом. Для этого и нужно разделение на этапы (сначала строки, потом столбцы).

Если же всё (и строки, и столбцы) берёшь одним способом, то ты сковываешь свои возможности. У тебя теряется вариативность применения разных методов, и ты обязан применять к столбцам те же методы парсинга, что и к строкам. Вот чтобы этой обязанности избежать, нужно поделить парсинг на два этапа.



Отредактировано py.user.next (Авг. 2, 2019 01:42:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version