2014-12-25 5 views
1

Новый для Python, в частности xpath - попытка соскрести список строк в список Python. Я понимаю, что я пытаюсь сделать, но не знаю, как бы я это написал. Я пытаюсь вытащить имена игроков на странице списка команд ESPN:Синтаксис XPath с Python

Я знаю, что мой код будет выглядеть примерно так, потому что есть таблица, и каждая запись, которую я хочу вытащить, имеет этот xpath (взятый из Chrome) - где я верьте, что это либо указывает на ссылку, либо на текст, на который ссылается ссылка.

//*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[3]/td[2]/a

Для моей проблемы, когда тр элемент справа, увеличивается на единицу, которая изменяет имя игрока < --- имеющие отношение к моей проблеме, потому что это данные, которые я в конечном счете искать.

For EachRow in Table: 
    If ChildElement exists: 
    Add Child Element to List 
    Else: nextrow 

Теперь бы я просто заменить EachRow с //*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i] и ChildElement с //*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i]/td[2]/a?

Также у кого-нибудь есть хороший блог или учебное сообщение, где я могу овладеть Xpath или, в частности, управлять Xpath при использовании вместе с Python? Мне интересно узнать о документации, потому что я не уверен, есть ли у них соответствующие примеры, но если это произойдет, я с удовольствием посмотрю.

Спасибо и Рождество все

КСТАТИ: ссылка Я пытаюсь рассекать http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics

ответ

2
import lxml.html as LH 
import urllib2 
url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics' 
doc = LH.parse(urllib2.urlopen(url)) 
print(doc.xpath(''' 
    //div[@id="my-players-table"]/div//table[1]//tr/td[2]/a/text()''')[1:]) 

дают

['Brandon Bass', 'Avery Bradley', 'Jae Crowder', 'Jeff Green', 'Jameer Nelson', 
'Kelly Olynyk', 'Phil Pressey', 'Marcus Smart', 'Jared Sullinger', 'Marcus 
Thornton', 'Evan Turner', 'Gerald Wallace', 'Brandan Wright', 'James Young', 
'Tyler Zeller'] 

При выскабливании страницы, первый чтобы визуально проверить полученный HTML-код с помощью urllib или запросов:

import urllib2 
url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics' 
response = urllib2.urlopen(url) 
with open('/tmp/test.html', 'wb') as f: 
    f.write(response.read()) 

Иногда HTML выглядит иначе, чем то, что вы видите в GUI браузере, потому что URLLIB или запросы не обрабатывает JavaScript. В этом случае могут потребоваться другие инструменты, такие как как селен. Однако, в этом случае, поиск текста для «Brandon Bass» показывает данные доступны в HTML скачанный с urllib2:

<td class="sortcell"><a href="http://espn.go.com/nba/player/_/id/2745/brandon-bass">Brandon Bass</a></td> 

Использование XPath вы размещены в качестве отправной точки, вы можете использовать интерактивный Python сессии, чтобы найти правильный XPath:

In [80]: import lxml.html as LH 
In [81]: import urllib2 
In [82]: url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics' 
In [83]: doc = LH.parse(urllib2.urlopen(url)) 
In [84]: [LH.tostring(elt) for elt in doc.xpath('//div[@id="my-players-table"]/div//table/tr')] 
Out[84]: 
['<tr class="stathead"><td colspan="8">Team Roster</td></tr>', 
'<tr class="colhead"><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/jersey/order/false/boston-celtics">NO.</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/order/false/boston-celtics">NAME</a></td><td>POS</td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/age/order/false/boston-celtics">AGE</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/height/order/false/boston-celtics">HT</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/weight/order/false/boston-celtics">WT</a></td><td>COLLEGE</td><td>2014-2015 SALARY</td></tr>', 
In [86]: [elt.text_content() for elt in doc.xpath('//div[@id="my-players-table"]/div//table/tr/td')] 

, которые приводят к

//div[@id="my-players-table"]/div//table[1]//tr/td[2]/a/text() 

(Выше, я сделал использование LH.tostring функции для проверки HTML-фрагментов, и elt.text_content() инспектировать текст, содержащийся в различных элементах.)


Это first tutorial я прочитал понять XPath.

Как только вы получите основы под своим поясом, вы можете начать читать the XPath v1.0 specification. Также есть XPath v2 и XPath v3, но текущий lxml поддерживает только XPath 1.0.

Одновременно вы можете прочитать lxml docs, предполагая, что вы используете lxml.

Я также нашел чтение Stackoverflow XPath questions, например this one, полезно.

Каждый раз, когда я сталкиваюсь с новой функцией или техникой, я пишу немного кода демонстрации - минимальный пример - показывая (мне), как это работает. Таким образом, всякий раз, когда мне нужно снова делать XYZ, я могу начать с какого-то исполняемого кода.

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