2011-11-15 140 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' 

我希望这有助于
扎卡里

相关问题