Python: 在lxml.cssselect中使用的CSS选择器
我正在尝试使用 lxml.html
来解析下面的 HTML 代码,并且想用 CSSSelector
来代替 XPath
。
link = doc.cssselect('html body div.results dl dt a)
上面的代码给我的输出是 content-1
和 content-2
,但我想要的输出是 link 1 link 2
。所以我把我的代码换成了:
link = doc.cssselect('html body div.results dl dt a[href]')
但我还是得到了相同的输出。所以我想问,获取 href 属性的正确 CSS 选择器是什么?
<div class = "results">
<div> some tags here </div>
<dl>
<dt title = "My Title 1" style = "background: transparent url('/img/accept.png') no-repeat right center">
<a href = "/link 1"> content-1</a>
</dt>
</dl>
<dl>
<dt title = "My Title 2" style = "background: transparent url('/img/accept.png') no-repeat right center">
<a href = "/link 2">content-2</a>
</dt>
</dl>
</div>
4 个回答
4
我成功地使用了
#element-id ::attr(value)
来获取HTML元素的“value”属性。
4
你需要从cssselect的结果中获取属性(它总是返回元素,而不是属性):
首先,我不太确定doc.cssselect(但这可能是你自己写的函数?)
通常使用的是lxml.cssselect:
from lxml.cssselect import CSSSelector
sel = CSSSelector('html body div.results dl dt a[href]')
然后,假设你已经有了一个doc
links = []
for a_href in sel(doc):
links.append(a_href.get('href'))
或者更简洁的写法:
links = [a_href.get('href') for a_href in doc.cssselect('html body div.results dl dt a[href]')]
10
我觉得你不能通过CSS选择器来获取属性值。你应该先获取元素...
>>> elements = doc.cssselect('div.results dl dt a')
...然后再从这些元素中获取属性:
>>> for element in elements:
... print element.get('href')
...
/link 1
/link 2
当然,列表推导式会对你很有帮助:
>>> [element.get('href') for element in elements]
['/link 1', '/link 2']
因为你不能通过CSS来更新属性的值,所以我觉得通过CSS选择器获取它们是没有意义的。你可以在CSS选择器中“提到”属性,以便只匹配它们对应的元素。不过,这只是我的想法,我可能错了;如果我错了,请有人纠正我 :) 好吧,@Tim Diggs在下面确认了我的假设 :)