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

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

<table border="0" cellpadding="3" cellspacing="0" width="100%">
    <tr height="25">
        <td class="th" style="border:none" width="2%"> </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 没有属性“文本”

【问题讨论】:

    标签: python html parsing web-scraping beautifulsoup


    【解决方案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 语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多