在将数据插入 sqlite db 之前,如何用从 selenium 抓取获得的文本中的实际字符替换

我正在使用带有 Python 2.7 的 Selenium (Chromedriver) 来抓取网站以获取一些显示在标签中的动态文本。里面是嵌套在 JSON 对象中的 HTML 代码,用于在我正在查看的页面上创建内容列表,但我只对获取文本内容感兴趣。我能够弄清楚如何使用 清除 HTML 标签re,但文本仍然包含特殊字符的 HTML 字符代码,我想用它们对应的字符替换。


因此,例如,假设我的 json(在清除 HTML 标签后)如下:


[

    {

        "data": {

            "published_on": "2019-01-15T08:46:00+00:00", 

            "id": "somealphanumericid", 

            "short_description": "Albert Einstein’s Theory of Relativity: Should We Worry…?", 

            "series": "Science", 

            "long_description": "Albert Einstein does an interview with Mr. John Smith about the application of the theory of relativity, and what it could mean for the future of the pizza industry!", 

            "duration": "752000", 

            "type": "video", 

            "title": "Albert Einstein’s Theory of Relativity:"

        }, 

        "links": {

            "permalink": "https://www.stackoverflow.com"

        }, 

        "key": "somealphanumericid"

    },

    ...

]

编辑:JSON 对象实际上是一个 JSON 对象数组,因此[]. 我正在抓取的站点是分页的,所以我从每个页面获取 JSON,最后将它们连接成一个数组,以便更容易使用。


您可以看到句点、逗号、冒号等字符被抓取为相应的 HTML 字符代码。


现在,我正在遍历 JSON 并将所有内容放入 sqlite 数据库中,因此我是否替换 JSON 本身中的字符代码,或者是否在将数据推送到数据库之前进行替换都没有关系。


我尝试做的第一件事是使用辅助函数,该函数将字符串作为参数并返回替换了字符的字符串。我基本上修改了可以在这里找到的解决方案。所以这个函数是:

但是,这导致解析时出现以下错误HTMLEntitiesToUnicode(data[i]['data']['series']):


File "BeautifulSoup.py", line 1918, in _detectEncoding

    '^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)

TypeError: expected string or buffer

我不明白为什么 BeautifulSoup 没有将其视为字符串,但我尝试将其修改为:


HTMLEntitiesToUnicode(str(data[i]['data']['series']))

然后给了我错误:


File "support.py", line 162, in json_to_rows

    HTMLEntitiesToUnicode(str(data[i]['data']['series'])),

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 129: ordinal not in range(128)

添加.encode('utf-8')也没有解决错误(在具有相同错误消息的各种其他帖子中推荐这样做)。


我的最终目标只是将所有这些信息刮到一个 db 中,使其格式化为正常的清晰文本(除了持续时间,INTEGER无论如何都是类型的)。


我想在数据被送入数据库之前/当数据被送入数据库时替换字符,但也有可能我可以在一个单独的函数中遍历数据库并清理它,尽管这似乎效率低得多这样做的方式。


慕勒3428872
浏览 175回答 2
2回答

泛舟湖上清波郎朗

我认为您在上面遇到的问题是您的文本已经是 unicode 格式,而您正试图将其再次转换为 unicode,这导致了您的错误。下面的代码对我有用,并给出了如下所示的输出。from bs4 import BeautifulSouptext = "Albert Einstein&#8217;s Theory of Relativity&#58; Should We Worry&#8230;&#63;"parsed_html = BeautifulSoup(text)print 'Original Type: ' + type(text)print 'Original Text: ' + textprint 'Parsed Type:&nbsp; &nbsp;' + type(parsed_html.text)print 'Parsed Text:&nbsp; &nbsp;' + parsed_html.text输出:Original Type: <type 'str'>Original Text: Albert Einstein&#8217;s Theory of Relativity&#58; Should We Worry&#8230;&#63;Parsed Type: <type 'unicode'>Parsed Text: Albert Einstein’s Theory of Relativity: Should We Worry…?使用 BeautifulSoup4 版本 4.7.1点安装 bs4

慕田峪4524236

事实证明,原因HTMLEntitiesToUnicode()对我不起作用是因为我正在从 .json 文件中读取数据,该文件已写入但未指示应将其保存在 .json 文件中utf-8。解决这个问题,然后HTMLEntititesToUnicode()如上所述使用效果很好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python