无法从 SPAN 标记中获取文本

Posted

技术标签:

【中文标题】无法从 SPAN 标记中获取文本【英文标题】:can't get text from SPAN tag 【发布时间】:2019-09-04 15:29:12 【问题描述】:

我尝试解析的网站结构如下所示:

<table border="0" cellpadding="3" cellspacing="0" >
    <tr >
        <td class="th" style="border:none" > </td>
        <td class="th">movie</td>
        <td class="th"> </td>
        <td class="th"> </td>
    </tr>

    <tr id="place_1">
        <td style="color: #555; vertical-align: top; padding: 6px">
            <a name="1"></a>1.
        </td>

        <td style="height: 27px; vertical-align: middle; padding: 6px 30px 6px 0">
            <a class="all" href="/326/">MOVIE TITLE IN SPANISH</a>

            <br/>

            <span class="text-grey">MOVIE TITLE IN ENGLISH</span> 
        </td>

        <td style="width: 85px">
            <div style="width: 85px; position: relative">
                <a class="continue" href="/326/votes/">
                    9.191
                </a> 

                <span style="color: #777">
                    (592 184)
                </span>
            </div>
        </td>
    </tr>

    ...
    ...
    ...

问题是我无法在 span-tag 中获取文本。我试过 .text 作为 a-tag,也试过 .get_text()。但这些都不起作用。我在 Python 上的代码:

for row in table.find_all('tr')[1:]:

    info = row.find_all('td')

    movies.append(
        'spn_title' : info[1].a.text,
        'eng_title' : info[1].span.text,
    )

我得到的错误:

AttributeError: 'NoneType' 对象没有属性 'get_text'

'eng_title' : info[1].span.text AttributeError: 'NoneType' object has 没有属性“文本”

【问题讨论】:

【参考方案1】:

我认为你应该使用innerhtml

info[1].getElementsByTagName('span')[0].innerHTML 

应该可以。

【讨论】:

'eng_title' : info[1].getElementsByTagName('span')[0].innerHTML TypeError: 'NoneType' object is not callable【参考方案2】:

试试下面的。另外,检查你的汤变量,因为我可以毫无问题地运行你的代码。我怀疑在 HTML 后面的某个地方你没有连续出现其中一个。


如果类名一致,您可以只过滤具有这些类的适当类型元素的合格行。使用 bs4 4.7.1。

for row in table.select('tr :has(span.text-grey):has(a.all)'):
    movies.append(
        'spn_title' : row.select_one('.all').text,
        'eng_title' : row.select_one('.text-grey').text
    )
print(movies)

否则,如果不存在,您需要一种处理方式。例如,

for row in table.find_all('tr')[1:]:
     movies.append(
        'spn_title' : row.select_one('.all').text if row.select_one('.all') is not None else 'None',
        'eng_title' : row.select_one('.text-grey').text if row.select_one('.text-grey') is not None else 'None'
    )
print(movies)

【讨论】:

仅供参考,您可以将选择器压缩一点tr :has(span.text-grey, a.all):has() 接受相对选择器列表。 第一个解决方案返回重复的行,因此每部电影都打印两次。第二种解决方案完全符合我的要求。太感谢了!!!但是 span 标签到底有什么问题呢? 您在某些情况下选择了我怀疑不存在项目的情况【参考方案3】:

我有同样的问题,但我能够解决它。 例子

<span class="a-offscreen">$10.99</span>

而不是Elem.FindElementByCss("span.a-offscreen").Text 使用:

Elem.FindElementByCss("span.a-offscreen").FindElementByXPath("parent::*").Text

诀窍是获取父级的文本。

顺便说一句,我使用的是 VBA,所以你需要将其更改为 Python 语法。

【讨论】:

以上是关于无法从 SPAN 标记中获取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium ChromeDriver 从 span 类中获取文本

在 Selenium WebDriver 上如何从 Span Tag 中获取文本

从 html 文档中的合格 span 标签获取类值和文本

jquery如何获取span的文本?

使用css选择器从元素中获取文本,不包括嵌套元素内的文本

无法从程序集中的所有类型中获取 Span<Type>