【问题标题】:How to deal with spaces in a HTML/JavaScript class name如何处理 HTML/JavaScript 类名中的空格
【发布时间】:2021-08-31 16:02:55
【问题描述】:

我在使用 Selenium 从元素获取数据时遇到问题:

bets = driver.find_elements_by_class_name('sgl-ParticipantFixtureLink gl-Market_General-cn1 ')

我可以使用 XPath 获取数据,但是获取所有值,因为它们具有相同的类名会更有效。

由于我对 HTML、Python、JavaScript 等很陌生,我想知道是否需要更改类名,使用:

"_" or "-"

填补类名中的空格?

bets = driver.find_elements_by_class_name('sgl-ParticipantFixtureLink-gl-Market_General-cn1-')

bets = driver.find_elements_by_class_name('sgl-ParticipantFixtureLink_gl-Market_General-cn1_')

它似乎没有返回任何值,但它也没有返回 null。

【问题讨论】:

  • 您能解释一下您的意思吗?“我可以使用 XPath 获取数据,但是获取所有值,因为它们具有相同的类名会更有效。”
  • 由于您似乎没有意识到,当一个元素在class 属性中有空格时,这意味着它有多个类。
  • 使用 XPath 我只得到 1 个值。但是,如果我要使用 1 个更有效的函数来获取所有值,不是吗?因为我想要获得的所有值都具有相同的“类名”。 @itronic1990

标签: javascript python html selenium web-scraping


【解决方案1】:

当一个元素在class 属性中有空格时,这意味着它有多个类,因此您需要以另一种方式处理。

一种选择是使用 CSS 选择器。

https://selenium-python.readthedocs.io/locating-elements.html#locating-elements

https://selenium-python.readthedocs.io/api.html#locate-elements-by

bets = driver.find_elements_by_css_selector('.sgl-ParticipantFixtureLink.gl-Market_General-cn1')

以句点 (.) 开头,每个后续课程之间都有一个句点(末尾没有)

这将返回一个列表,其中包含具有这两个类的所有 in 元素

例如,如果您想将其转换为文本列表,您可以这样做:

# after the code above
texts = [bet.text for bet in bets]

【讨论】:

  • 现在我可以找到所有的elements,但无法从它们那里得到值,这是一个介于"::before" and "::after" 之间的数字。我尝试使用 .text 但得到 AttributeError: 'list' object has no attribute 'text'.
【解决方案2】:

正如 Samathingamajig 所提到的,在多个类名的情况下,定位元素的最简单方法是使用 css_selector
如果有多个元素与该定位器匹配,您可以遍历元素列表并从每个元素中获取文本。像这样:

bets = driver.find_elements_by_css_selector('.sgl-ParticipantFixtureLink.gl-Market_General-cn1')
for bet in bets:
    text = bet.text
    print(text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2016-05-03
    • 2012-06-10
    • 2023-03-22
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多