2012-02-27 2 views
1

하자 나는 다음과 같은 코드가 있다고 가정 :Xpath (lxml)를 사용하여 여러 태그에서 텍스트를 추출하는 방법은 무엇입니까?

<table> 
    <tr> 
    <td colspan=2>Date</td> 
    </tr> 
    <tr id='something'> 
    <td>8 september</td> 
    <td>2008</td> 
    </tr> 
</table> 

내가 "(8) 2008 년 9 월"가지고 날짜를 추출 할.

+0

http://stackoverflow.com/a/1405439/181772 [자격 자식 노드 값의 문자열 연결을 반환하는 XPath에]의 –

+0

가능한 중복 (HTTP : // 유래 .com/questions/1403971/xpath-return-string-concatenation-child-node-values) –

답변

2

순수한 XPath 1.0 솔루션입니다.

사용 :

string(normalize-space(//table/tr[@id = 'something'])) 
+0

놀라움. " ..."30x, 30x 문자열을 가져 오는 방법은 무엇입니까? – acheruns

+1

@acheruns :이 노드가 30 번있는 경우 XPath 1.0 만 있으면 모든 필수 문자열을 가져올 수 없습니다. 루프마다 (1에서 count (expression)까지) 다른 인덱스를 사용할 때마다 XPath 표현식을 30 번 평가해야합니다. '$ k'는 1에서'count (')까지의 숫자로 대체되어야합니다. // table/tr [@id = 'something'])' –

0

당신은 각 td 요소의 텍스트를 수집하고 ' '.join(...)로 참여할 수 :

import lxml.html as LH 

content = ''' 
<table> 
    <tr> 
    <td colspan=2>Date</td> 
    </tr> 
    <tr id='something'> 
    <td>8 september</td> 
    <td>2008</td> 
    </tr> 
</table> 
''' 

doc = LH.fromstring(content) 
date = ' '.join(td.text for td in doc.xpath('//table/tr[@id = "something"]/td')) 
print(date) 

당신이 캐리지 리턴을 처리 할 수 ​​있다면, 당신은 text_content()을 사용할 수,

8 september 2008 

을 산출 또는 방법 :

for td in doc.xpath('//table/tr[@id = "something"]'): 
    print(td.text_content()) 

yield s

8 september 
    2008 
관련 문제