2014-12-25 8 views
1

Python 입문, 특히 xpath - 문자열 목록을 파이썬 목록으로 긁어 내려고 시도합니다. 내가 뭘하려고하는지 이해하지만 어떻게 쓰는지 모르겠다. 나는 ESPN의 팀 명단 페이지에서 플레이어 이름을 가져 오려고 노력하고있다.Python을 사용한 XPath 구문

테이블이 있고 내가 끌어 당길 각 항목에이 xpath (Chrome에서 가져옴)가 있기 때문에 내 코드가 다음과 같이 보일 것이다. a가 링크 또는 링크가 가리키는 텍스트를 가리키고 있다고 생각하십시오. 이것이 내가 궁극적으로 추구하는 데이터이기 때문에 내 문제에 관련된 선수 이름 <을 --- 변경 오른쪽에 그럴 요소가 증가 내 문제에 대해서는

//*[@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 

이제 난 그냥 //*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i]/td[2]/a//*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i]EachRowChildElement을 대체 할 것이다?

누구도 좋은 블로그를 가지고 있습니까, 아니면 Python과 함께 사용할 때 Xpath를 마스터 할 수 있습니까? 문서를 읽는 것에 대해 궁금합니다. 관련 예제가 있는지 확실하지 않기 때문에 궁금합니다. 그렇다면 기꺼이 살펴 보겠습니다.

감사합니다 메리 크리스마스 모두 BTW

: 나는 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'] 

페이지를 긁어, 제일 먼저 산출 urllib 또는 요청을 사용하여받은 HTML을 시각적으로 검사하는 것 :

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()) 

urllib 또는 요청이 JavaScript를 처리하지 않기 때문에 HTML이 GUI 브라우저에서 보는 것과 다른 경우가 있습니다. 이 경우 셀레늄과 같은 다른 도구 (예 : )가 필요할 수 있습니다. 그러나이 경우, "브랜든 베이스"에 대한 텍스트 검색 데이터가 urllib2를로 다운로드 HTML에 액세스 할 수 있습니다 보여줍니다 당신이 출발점으로 게시 XPath를 사용

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

, 당신은 다음을 사용할 수 있습니다 대화 형 파이썬 세션이 올바른 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() 

(위 이어질, 나는 0,123,922 사용했다기능은 HTML 미리보기를 검사하고, elt.text_content()는 다양한 요소에 포함 된 텍스트를 검사 할 수 있습니다.)


이 내가 XPath를 이해하는 읽기 first tutorial입니다.

벨트 밑에 기초가 생기면 the XPath v1.0 specification을 읽을 수 있습니다. XPath v2XPath v3도 있지만 현재 lxml은 XPath 1.0 만 지원합니다.

동시에 lxml을 사용한다고 가정하면 lxml docs을 읽을 수 있습니다.

나는 또한 this one과 같은 유용한 정보를 찾을 수 있습니다.

새로운 기능이나 기술이 생길 때마다, 최소한의 예제 인 데모 코드를 작성하여 (자체) 작동 방식을 보여줍니다. 그런 식으로 XYZ를 다시해야 할 때마다 실행 가능한 코드부터 시작할 수 있습니다.