Python: 在lxml.cssselect中使用的CSS选择器

9 投票
4 回答
10573 浏览
提问于 2025-04-17 09:09

我正在尝试使用 lxml.html 来解析下面的 HTML 代码,并且想用 CSSSelector 来代替 XPath

link = doc.cssselect('html body div.results dl dt a)

上面的代码给我的输出是 content-1content-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在下面确认了我的假设 :)

撰写回答