编写html文件时出现奇怪的字符 open(file.html, 'a', encodint=utf-8) python



我正在使用Jinja和BS4来抓取html并粘贴到一个新文件中,一切正常。

为另一个客户端修改了它,它给我带来了一个编码错误,我添加了编码=utf-8,它再次工作。

然而,一些文本现在是gobblydegook,老实说,我不知道它是什么,但它不是ASCII

示例字符:"这不是长破折号。

使用脚本的其他版本,它无需编码即可工作,并且还会抛出零个奇怪的字符。

完整的脚本在这里: git

有问题的项目是第 133 行

打开网页

f = open(new_file + '.html', 'a', encoding='utf-8')
message = result
f.write(message)# write result
f.close()#close html

*请注意,我没有使用编码推送新版本。

我通过使用请求通过URL从美丽汤中读取它。

r = requests.get(ebay_url)
html_bytes = r.content
html_string = html_bytes.decode('UTF-8')
soup = bs4(html_string, 'html.parser')
description_source = soup.find("div", {"class":"dv3"})

使用 .text(不是 .content !(从请求模块获取解码的响应内容。这样,您就不必手动解码响应。请求模块将通过查看 HTTP 响应标头自动选择正确的编码。

import codecs
import requests
from bs4 import BeautifulSoup as bs4
def get_ebay_item_html(item_id):
    ebay_url = 'http://vi.vipr.ebaydesc.com/ws/eBayISAPI.dll?ViewItemDescV4&item='
    r = requests.get(ebay_url + str(item_id))
    return r.text

现在我们可以检索一个项目:

item_to_revise = "271796888350"
item_html = get_ebay_item_html(item_to_revise)

。从中抓取数据:

soup = bs4(item_html , 'html.parser')
dv3 = soup.find("div", {"class":"dv3"})
print dv3

。将其保存到文件:

with codecs.open("271796888350.html", "w", encoding="UTF-8") as f:
    f.write(item_html)

。从文件加载它:

with codecs.open("271796888350.html", "r", encoding="UTF-8") as f:
    item_html = f.read()

。或者发送到eBaySDK模块。为此,我强烈建议不要使用这样的结构:"<![CDATA["+ f.read() + "]]>"。CDATA 无法以这种方式可靠地构建。改用适当的 XML 编码函数,它更安全。

from xml.sax.saxutils import escape
from ebaysdk.trading import Connection as Trading
api = Trading(debug=args.debug, siteid=site_id, appid=app_id, token=token_id, config_file=None, certid=cert_id, devid=dev_id)
api.execute('ReviseFixedPriceItem', {
    "Item": {
        "Country": "GB",
        "Description": escape(item_html),
        "ItemID": item_to_revise
    }
})

事实上,ebaysdk 模块似乎支持一个 escape_xml 标志,它透明地执行上述代码所做的工作。我认为你应该改用它:

api = Trading(escape_xml=true, debug=args.debug, siteid=site_id, appid=app_id, token=token_id, config_file=None, certid=cert_id, devid=dev_id)
api.execute('ReviseFixedPriceItem', {
    "Item": {
        "Country": "GB",
        "Description": item_html,
        "ItemID": item_to_revise
    }
})

在我的测试中,所有角色在所有点上看起来都很好。

f = open(new_file + '.html', 'a', encoding='utf-8')
x = f.read()
re.sub(ur'\u2014','-',x)
re.sub(ur'xc3xa2xc2x80xc2','-',x)
re.sub(ur'xe3xa2xe2x80xe2','-',x)
print x

最新更新