(html scraping) xpath столбца изменяется в зависимости от цвета

Я пытаюсь проанализировать все значения в столбце этот сайт (с разными биржевыми тикерами). Я работаю на Python и использую XPath для очистки данных HTML.

Допустим, я хочу извлечь значение «Изменения», которое в настоящее время составляет 0,62% (и зеленое). Я сначала помещал дерево на сайт, а потом говорил.

stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/span/text()') 

Затем я получил бы массив значений, и последний элемент оказался бы измененным значением.

Однако я заметил, что если значение в этом столбце имеет цвет, оно находится в /b/SPAN, а если у него нет цвета, нет диапазона и его только в /b.

Итак, чтобы объяснить:

stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/span/text()') 

^ этот массив будет иметь каждое значение в этом столбце, которое является цветным.

while stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/text()') 

^ будет иметь каждое значение в столбце, не имеющее цвета.

Цвета не совпадают для каждой акции. У некоторых акций есть случайные значения, у которых есть цвета, а у некоторых нет. Так что это нарушает согласованность массивов /b/span и /b.

Как я могу получить массив переменных ВСЕХ значений (по порядку) в каждом столбце независимо от того, находятся ли они в диапазоне или нет? Меня не волнуют цвета, меня интересуют только значения.

Если нужно, я могу объяснить больше. Спасибо!!

Что вы используете для очистки данных? BS4? скрап?

A.Lorefice 13.09.2018 20:49
1
1
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете напрямую пропустить промежуточные теги в xpath и получить все значения в списке, используя // между ними.

Итак, фрагмент должен быть

tree.xpath('//*[@class="table-dark-row"]/td[12]/b//text()')

Это пропускает все промежуточные теги между и text.

Я пробовал использовать lxml. Вот код

import requests
from lxml import html
url="https://finviz.com/quote.ashx?t=acco&ty=c&ta=1&p=d"
resp=requests.get(url)
tree = html.fromstring(resp.content)
values = tree.xpath('//*[@class="table-dark-row"]/td[12]/b//text()')
print values

Что дает следующий результат

['0.00%', '-2.43%', '-8.71%', '-8.71%', '7.59%', '-1.23%', '1.21', '0.30', '2.34% 2.38%', '12.05', '12.18', '1.04%']

Note: If you don't want to hardcode 12 in the above Xpath you can aslo use last() as tree.xpath('//*[@class="table-dark-row"]/td[last()]/b//text()')

Шпаргалка по Xpath для вашей любезной справки.

Использование выражений "//" и ".//" в директивах поиска XPath XML в ColdFusion

Я протестирую это позже, хотя мне нравится, куда вы собираетесь. Спасибо!

da409 13.09.2018 21:56

Работал. Большое спасибо!

da409 13.09.2018 22:33

Другие вопросы по теме