寻求一些帮助。我正在研究使用Python中的Beautiful Soup抓取特定Craigslist帖子的项目。我可以成功地显示在帖子标题中找到的表情符号但在帖子正文中没有成功。我尝试过不同的变化但到目前为止还没有任何工作。任何帮助将不胜感激。
代码:
f = open("clcondensed.txt", "w")
html2 = requests.get("https://raleigh.craigslist.org/wan/6078682335.html")
soup = BeautifulSoup(html2.content,"html.parser")
#Post Title
title = soup.find(id="titletextonly")
title1 = soup.title.string.encode("ascii","xmlcharrefreplace")
f.write(title1)
#Post Body
body = soup.find(id="postingbody")
body = str(body)
body = body.encode("ascii","xmlcharrefreplace")
f.write(body)
从身体收到错误:
'ascii' codec can't decode byte 0xef in position 273: ordinal not in range(128)
答案 0 :(得分:1)
您应该使用unicode
body = unicode(body)
请参阅Beautiful Soup Documentation NavigableString
<强>更新强>
很抱歉快速回答。这不对。
在这里,您应该使用lxml
解析器而不是html
解析器,因为html
解析器不能很好地支持NCR (Numeric Character Reference)
表情符号。
在我的测试中,当NCR
表情符号十进制值大于65535时,例如你的html演示表情符号🚢
,HTML
解析器只是用错误的unicode \ufffd
解码它u"\U0001F6A2"
。我找不到准确的Beautiful Soup reference
,但lxml
解析器就行了。
以下是经过测试的代码:
import requests
from bs4 import BeautifulSoup
f = open("clcondensed.txt", "w")
html = requests.get("https://raleigh.craigslist.org/wan/6078682335.html")
soup = BeautifulSoup(html.content, "lxml")
#Post Title
title = soup.find(id="titletextonly")
title = unicode(title)
f.write(title.encode('utf-8'))
#Post Body
body = soup.find(id="postingbody")
body = unicode(body)
f.write(body.encode('utf-8'))
f.close()
您可以参考lxml entity handling做更多事情。
如果您未安装lxml
,请参阅参考lxml installing。
希望得到这个帮助。