【问题标题】:How to deal with nbsp in html elements in Python?如何在 Python 中处理 html 元素中的 nbsp?
【发布时间】:2021-07-31 23:34:54
【问题描述】:

我在下面的 & 和 nbsp 之间使用了空格,尽管在我的代码中没有空格。

我正在尝试使用 Beautifulsoup 进行网页抓取,但目前遇到了一个问题。我能够使用 find_all 成功获取我需要的元素,它在一个表中,所以首先是键,其次是值。所以我使用网站中设置的key变量名,用if语句与我需要的key进行大小写匹配,然后获取它的相关值,但是html中的一些key变量包含  在键变量名的文本之间。 If 语句与曾经存在   的变量不匹配。

以下是谷歌浏览器检查模式的 html

<tr valign="top">
        <td><b>Active&nbsp;since:</b></td>
        <td><a href="/InterH1/Category:E_2012" title="Category:2021 H1">14199083</a> (212E)</td>
    </tr>

以下代码来自soup方法

<tr valign="top">
<td><b>Active since:</b></td>
<td><a href="/InterH1/Category:E_2012" title="Category:2021 H1">14199083</a> (212E)</td>
</tr>

If 语句适用于所有变量,只要关键变量是一个没有空格的单词,如下所示

if keycheck[0].get_text().strip() == "Year:":
        intercincom_eight_year = keycheck[1].get_text().strip() 

但无论关键变量包含  ,它都会失败,例如

if keycheck[0].get_text().strip().replace("&nbsp;", " ") == "Active since:":
        intercincom_eight_active = keycheck[1].get_text().strip()

if keycheck[0].get_text().strip() == "Active since:":
        intercincom_eight_active = keycheck[1].get_text().strip()

我认为我不必使用替换来删除带有空格的 nbsp,因为每当我打印关键变量时,它都会在没有 nbsp 的情况下打印,这与 chrome 检查模式中存在的不同。例如

        print(keycheck[0].get_text().strip())

给出 Active year: 而不是 Active since: 但它仍然不匹配 if声明

if keycheck[0].get_text().strip() == "Active since:":

感谢您的帮助,谢谢

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    您可能需要对不间断空格使用 Unicode 表示,即u'\xa0'。由于 Beautiful Soup 中的字符串文字没有明确包含“&amp;nbsp;”,因此您对replace() 的调用可能正在搜索不存在的字符串。

    >>> print(u'\xa0' == " ")
    False
    
    >>> print(u'\xa0' == "&nbsp;") 
    False
    

    为了进一步说明您的代码,您应该能够通过将调用 replace() 中的“&amp;nbsp;”更改为 "\xa0" 来实现这一点,因此...

    keycheck[0].get_text().strip().replace("\xa0", " ") == "Active since:":
    

    【讨论】:

    • 感谢您的回复,我是python的初学者,所以仍然对您的帖子感到困惑,如果可能的话,请您详细说明如何进行。我确实检查了其他答案中提到的 unicode 表示,但它们都主要处理文件,我不知道如何将它与汤一起包含在这里,感谢您的时间和帮助。
    • 您只需将replace() 中的第一个参数更改为\xa0,所以...keycheck[0].get_text().strip().replace("\xa0", " ") == "Active since:":
    • 如果我要提供任何其他建议,您也可以通过在要检查的字符串上运行 .lower() 来省去一些麻烦,这样您就不必担心大写或比较中的小写。
    猜你喜欢
    • 2015-08-13
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多