WebScraping: диапазон индекса списка Xpath - PullRequest
0 голосов
/ 04 ноября 2018

Когда я запускаю следующий код, я получаю сообщение списка индекса вне диапазона:

import requests
from lxml.html import fromstring

def get_values():
    print('executing get_values...')
    url = 'https://sports.yahoo.com/nba/stats/weekly/?sortStatId=POINTS_PER_GAME&selectedTable=0'
    response = requests.get(url)
    parser = fromstring(response.text)
    for i in parser.xpath('//tbody/tr')[:100]:
         **FGM = i.xpath('.//td[4]/span/text()')[0] #This runs with no error even though its has similar xpath.**
         print('FGM: ' + FGM)     
         G = i.xpath('.//td[2]/span/text()')[0]
         print(G)

values = get_values()

Когда я запускаю код, я получаю следующее сообщение об ошибке:

 G=i.xpath('/./td[2]/span/text()')[0]
 IndexError: list index out of range

Я попытался отладить, используя следующие операторы.

print(parser.xpath('//tbody/tr/td[2]/span/text()')) #Returns list['4', '4', '3', '3', '3', '4', '4', '3', '2', '4', '3']
print(parser.xpath('//tbody/tr/td[2]/span/text()')[0]) #Returns value = 4
print(len(parser.xpath('//tbody/tr/td[2]/span/text()')[0])) # Returns value = 1

Выходные данные показывают ожидаемые значения, поэтому я не уверен, почему это не работает. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Селектор, который выбирает элементы, удовлетворяющие запросу //foo/bar/qux, отличается от написания запроса //foo, затем выполняет итерацию по нему и ожидает, что все эти элементы будут иметь ./bar/qux. Возможно, существует множество <foo> s без <bar> или <qux>.

Вот, например, в исходном коде мы видим <tr>:

<tr class="Bgc(secondary-enhanced):h" data-reactid="1522">
    <th class="Px(cell-padding-x) Py(cell-padding-y) Bd...>

, поэтому <tr> не содержит <td> с, но <th> с (для строки заголовка).

def get_values():
    print('executing get_values...')
    url = 'https://sports.yahoo.com/nba/stats/weekly/?sortStatId=POINTS_PER_GAME&selectedTable=0'
    response = requests.get(url)
    parser = fromstring(response.text)
    for i in parser.xpath('//tbody/tr<b>[td[4]/span and td[2]/span]</b>')[:100]:
         FGM = i.xpath('.//td[4]/span/text()')[0] #This runs with no error even though its has similar xpath.  
         print('FGM: ' + FGM)
         G = i.xpath('.//td[2]/span/text()')[0]
         print(G)

Здесь последние две строки не включены в результат, так как они , а не , заключенные в тег <span>, поэтому вам потребуется выполнить некоторые дополнительные запросы, чтобы выбрать правильные строки и извлечь правильные значения.

0 голосов
/ 04 ноября 2018

Сбой, потому что не всегда <span> во втором <td>. Это должно работать:

def get_values():
    print('executing get_values...')
    url = 'https://sports.yahoo.com/nba/stats/weekly/?sortStatId=POINTS_PER_GAME&selectedTable=0'
    response = requests.get(url)
    parser = fromstring(response.text)
    for i in parser.xpath('//tbody/tr')[:100]:
         FGM = i.xpath('.//td[4]/span/text()')[0] #This runs with no error even though its has similar xpath.**
         print('FGM: ' + FGM)
         G = i.xpath('.//td[2]/text()|.//td[2]/span/text()')[0]  # <--- Changed this
         print(G)

values = get_values()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...