2011-11-15 105 views
3

這必須是一個絕對的經典,但我在這裏找不到答案。我解析以下標記與LXML cssselect:lxml classic:獲取除嵌套標籤之外的文本內容?

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

我想要得到的<li>標籤的內容,而不<span>標籤的內容。

目前我有:

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

但是,這給了我3 Detroit。我怎樣才能得到Detroit

回答

3

itertext元素的方法返回節點文本數據的迭代器。對於您的<a>標記,' Detroit'將是迭代器返回的第二個值。如果文檔的結構始終符合已知規範,則可以跳過特定的文本元素以獲取所需內容。

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 

可以CSS選擇器與Zachary's answer這樣提到的XPath text()功能結合在一起(如果你更舒適的使用CSS選擇比的XPath):

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

我不是很熟悉與lxml,但這是工作在空閒(v2.7.2)。我認爲去用XPath比CSS更好打賭:

​​

這似乎在選擇之後需要更少的折騰。

編輯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' 

我希望這有助於
扎卡里

相關問題