2016-11-19 3 views
0

Я пытаюсь очистить данные от here с помощью XPath, и хотя я использую проверку для копирования пути и добавления/текста() в конец пустого списка возвращается вместо ["Class 5"] для текста между последними тегами span.Невозможно получить текст с помощью Xpath, хотя использование/text() уже

import requests 
from lxml import html 

sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16") 
tree = html.fromstring(sample_page.content) 
r1class = tree.xpath('//*[@id="resultsListContainer"]/div[3]/table/tbody/tr[1]/td/span[1]/text()') 

print(r1class) 

Элемента, который я ориентация является классом для расы 1 (Class 5), а структура соответствует XPath, что я использую.

+0

// * [@ id = "resultsListContainer"]/div [3]/table // tr [1]/td/span [1]/text() – spinkus

+0

все еще ничего не получает – McLeodx

+1

Проверка с использованием Firebug доказывает, что нет ничего неправильно с вашим выражением XPath, должно быть что-то еще. – Bouke

ответ

1

Приведенный ниже код должен выполнять задание, то есть он работает при использовании других сайтов с соответствующим выражением XPath. Сайт racenet не доставляет допустимый HTML-код, что, вероятно, может быть причиной отказа вашего кода. Это можно проверить с помощью W3C онлайн валидатор: https://validator.w3.org

import lxml.html 

html = lxml.html.parse('https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16') 
r1class = html.xpath('//*[@id="resultsListContainer"]/div[3]/table/tbody/tr[1]/td/span[1]/text()')[0] 
print(r1class) 
+0

Обходным решением может быть чтение HTML-документа с использованием библиотеки * запросов *, исправление объявления HTML и анализ исправленного содержимого HTML. – Bouke

+0

Нет, это обходное решение не получилось очень хорошо ... – Bouke

1

Это должно вам начать работу.

import requests 
from lxml.etree import HTML 

sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16").content 
tree = HTML(sample_page) 
races = tree.xpath('//table[@class="tblLatestHorseResults"]') 
for race in races: 
    rows = race.xpath('.//tr') 
    for row in rows: 
     row_text_as_list = [i.xpath('string()').replace(u'\xa0', u'') for i in row.xpath('.//td') if i is not None] 
1

Ваше выражение XPath не соответствует ни одному, потому что HTML-страница, которую вы пытаетесь очистить, серьезно нарушена. FF (или любой другой веб-браузер) фиксирует страницу в пути, прежде чем отображать ее. Это приводит к добавлению тегов HTML, которых нет в исходном документе.

Следующий код содержит выражение XPath, которое, скорее всего, укажет вам в правильном направлении.

import requests 
from lxml import html, etree 
sample_page = requests.get("https://www.racenet.com.au/horse-racing-results/happy-valley/2016-11-16") 
tree = html.fromstring(sample_page.content) 
nodes = tree.xpath("//*[@id='resultsListContainer']/div/table[@class='tblLatestHorseResults']/tr[@class='raceDetails']/td/span[1]") 
for node in nodes: 
    print etree.tostring(node) 

При выполнении этого печатает следующее:

$ python test.py 
<span class="bold">Class 5</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 4</span> Track: 
<span class="bold">Class 3</span> Track: 
<span class="bold">Class 2</span> Track: 
<span class="bold">Class 3</span> Track: 

Подсказка: всякий раз, когда вы пытаетесь, чтобы очистить веб-страницы, и вещи просто не работают, как и ожидалось, загрузить и сохранить HTML в файл. В этом случае, например:

f = open("test.xml", 'w') 
f.write(sample_page.content) 

Затем просмотрите сохраненный HTML. Это дает вам представление о том, как будет выглядеть DOM.

Смежные вопросы