这一定是绝对经典,但我在这里找不到答案。我正在使用lxml cssselect解析以下标记:
<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
?
答案 0 :(得分: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')]
答案 1 :(得分:3)
我对lxml不太熟悉,但这在IDLE(v2.7.2)中有效。我认为使用XPath比使用CSS更好:
>>> xml = '<li><a href="/stations/1"><span class="num">3</span> Detroit</a></li>'
>>> root = etree.fromstring(xml)
>>> print( root.xpath('/li/a/text()'))
[' Detroit']
选择之后,这似乎需要更少的重复。
编辑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'
我希望这有帮助,
扎卡里