我正在使用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从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"})
答案 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