2011-11-15 15 views
3

これは完全な古典でなければなりませんが、私はここで答えを見つけることができません。私はlxmlのcssselectで次のタグを解析しています:lxml classic:ネストされたタグ以外のテキストコンテンツを取得しますか?

<li><a href="/stations/1"><span class="num">3</span> Detroit</a></li> 

私は<span>タグの内容ずに<li>タグの内容を取得したいです。

stop_list = doc.cssselect('ol#stations li a') 
start = stop_list[0].text_content().strip() 

しかし、それは私に3 Detroitを与える:

現在、私は持っています。 Detroitを入手するにはどうすればよいですか?

答えて

3

itertext要素のメソッドは、ノードのテキストデータの反復子を返します。 <a>タグの場合、' Detroit'はイテレータによって返された2番目の値になります。ドキュメントの構造が常に既知の仕様に準拠している場合は、特定のテキスト要素をスキップして必要なものを得ることができます。

from lxml import html 

doc = html.fromstring("""<li><a href="/stations/1"><span class="num">3</span> Detroit</a></li>""") 
stop_nodes = doc.cssselect('li a') 
stop_names = [] 
for start in stop_list: 
    node_text = start.itertext() 
    node_text.next() # Skip '3' 
    stop_names.append(node_text.next().lstrip()) 
    continue 

(あなたは、XPathよりもCSSのセレクタを使用して、より快適にしている場合)あなたはこのようZachary's answerに言及したのxpath text()機能でCSSセレクタを組み合わせることができます。

stop_names = [a.xpath('text()').lstrip() for a in doc.cssselect('li a')] 
3

、私は非常に精通していませんよこれはIDLE(v2.7.2)で動作しています。私はXPathの方がCSSより良いベットだと思っています。

​​

これは、選択後に必要以上に細かいところがないようです。

EDIT 1

はここにあなたの決定に影響を与える可能性がわずかに異なる例を示します、私はこのことができます願ってい

>>> xml = '<li><a href="/stations/1">I <span>FooBar!</span> love <span class="num">3</span> Detroit</a></li>' 
>>> root = etree.fromstring(xml) 
>>> print(root.xpath('/li/a/text()')) 
['I ', ' love ', ' Detroit'] 
>>> ' '.join([x.strip() for x in root.xpath('/li/a/text()')]) 
'I love Detroit' 


ザカリー

関連する問題