为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2021-10-12 10:23:17
我正在使用带有 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&#8217;s Theory of Relativity&#58; Should We Worry&#8230;&#63;",             "series": "Science",             "long_description": "Albert Einstein does an interview with Mr&#46; John Smith about the application of the theory of relativity&#44; and what it could mean for the future of the pizza industry&#33;",             "duration": "752000",             "type": "video",             "title": "Albert Einstein&#8217;s Theory of Relativity&#58;"        },         "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无论如何都是类型的)。我想在数据被送入数据库之前/当数据被送入数据库时替换字符,但也有可能我可以在一个单独的函数中遍历数据库并清理它,尽管这似乎效率低得多这样做的方式。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我认为您在上面遇到的问题是您的文本已经是 unicode 格式,而您正试图将其再次转换为 unicode,这导致了您的错误。


下面的代码对我有用,并给出了如下所示的输出。


from bs4 import BeautifulSoup


text = "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: ' + text

print 'Parsed Type:   ' + type(parsed_html.text)

print 'Parsed Text:   ' + 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


查看完整回答
反对 回复 2021-10-12
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

事实证明,原因HTMLEntitiesToUnicode()对我不起作用是因为我正在从 .json 文件中读取数据,该文件已写入但未指示应将其保存在 .json 文件中utf-8。解决这个问题,然后HTMLEntititesToUnicode()如上所述使用效果很好。


查看完整回答
反对 回复 2021-10-12
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信