Python:CSS选择器,用于lxml.cssselect内部
我正在尝试使用lxml.html解析下面给出的html代码,并使用CSSSelector而不是XPath 上面的代码将content-1和content-2作为输出,但我希望的输出是link1-link2。所以我用Python:CSS选择器,用于lxml.cssselect内部,python,css,css-selectors,lxml,Python,Css,Css Selectors,Lxml,我正在尝试使用lxml.html解析下面给出的html代码,并使用CSSSelector而不是XPath 上面的代码将content-1和content-2作为输出,但我希望的输出是link1-link2。所以我用 link = doc.cssselect('html body div.results dl dt a[href]') 但我还是得到了同样的结果。所以我的问题是什么是获取href属性的正确CSS选择器 <div class = "results"&g
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>
我相信你不能通过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证实了我下面的假设:你需要获取css结果的属性select它总是返回元素,而不是属性: 首先,我不确定doc.cssselect是否正确,但这可能是您自己的功能 lxml.cssselect通常用于:
from lxml.cssselect import CSSSelector
sel = CSSSelector('html body div.results dl dt a[href]')
那么,假设你已经有医生了
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]')]
我成功地使用了
#element-id ::attr(value)
获取HTML元素的value属性。lxml cssselector使用属性选择。下面的代码可以从HTML脚本元素中选择src属性
select = cssselect.CSSSelector("script[src]")
links = [ el.get('src') for el in select(dochtml) ]
links=iter(links)
for n, l in enumerate(links):
print n, l
@brandizzi,你说得对-你只能选择css中的元素,而不能选择属性-括号用于筛选要选择的元素,但只选择不带href属性的标记不是一个坏主意,a[href]就是这样做的。@RanRag,你应该勾选brandizzi的答案,即使你最后不需要它。我本来打算勾选它,但你只能在一段时间后接受答案,我相信它的arnd 5分钟基本上doc相当于doc=lxml.html.fromstringcontent,其中content是我从urllib和read函数获得的html数据
select = cssselect.CSSSelector("script[src]")
links = [ el.get('src') for el in select(dochtml) ]
links=iter(links)
for n, l in enumerate(links):
print n, l