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

时间:2017-05-29 09:22:50

标签: python encoding utf-8

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

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

然而,有些文字现在是gobblydegook,说实话,我不知道它是什么,但它不是ASCII

  

示例字符:â“这不是长划线。

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

完整的脚本在这里:git

违规项目是第133行

打开html

f = open(new_file + '.html', 'a', encoding='utf-8')

message = result

f.write(message)# write result

f.close()#close html

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

我正在使用请求通过URL从BeautifulSoup中读取它..

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"})

2 个答案:

答案 0 :(得分:2)

使用.text(不是.content!)从请求模块中获取decoded response 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 module。为此,我强烈反对使用像这样的结构:"<![CDATA["+ f.read() + "]]>"。 CDATA无法以这种方式可靠地构建。使用proper XML encoding function代替,它更安全。

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
    }
})

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

答案 1 :(得分:-1)

f = open(new_file + '.html', 'a', encoding='utf-8')
x = f.read()

re.sub(ur'\\u2014','-',x)
re.sub(ur'\xc3\xa2\xc2\x80\xc2','-',x)
re.sub(ur'\xe3\xa2\xe2\x80\xe2','-',x)
print x