【问题标题】:weird character printed when web scraping网页抓取时打印出奇怪的字符
【发布时间】:2022-01-09 20:57:28
【问题描述】:

我尝试编写一些代码来查找和打印特定书籍的价格,但是当我运行代码时,它返回了£54.23

 是什么?如何让它消失?

据我了解,我应该复制 soup.select 的 CSS 路径,但由于此选项未显示在 chrome 上,因此我复制了选择器。这能对Â负责吗?

这是我的 Python 代码:

import requests
from bs4 import BeautifulSoup

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
headers = {'User-Agent': user_agent}
res_obj = requests.get('http://books.toscrape.com/')
res_obj.raise_for_status()
soup = BeautifulSoup(res_obj.text, 'html.parser')
sapiens_price = soup.select('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(5) > article > div.product_price > p.price_color')
print(sapiens_price[0].text)

【问题讨论】:

  • 这是我可以复制的选择器和其他选项的屏幕截图的链接。由于某种原因,我无法将链接作为附件发布。
  • 您可能使用错误的文本编码解码文档。将文档在content-type http 响应标头中声明的编码与您用于解码的任何编码进行比较。
  • 内容类型为 text/html 但内容编码为 gzip。由于我的程序使用 Python 3.10.0,看来网页必须使用 utf-8 解码。

标签: python python-3.x web-scraping


【解决方案1】:

原因是response.text 没有使用正确的编码。

请参阅requests documentation,并注意这一点:

当您发出请求时,Requests 会根据 HTTP 标头对响应的编码进行有根据的猜测。访问r.text时使用Requests猜测的文本编码

在您的情况下,如果您在 IDLE 中运行代码,这就是您在检查编码时得到的结果:

>>> res_obj.encoding
'ISO-8859-1'

再次来自文档:

如果您更改编码,请求将在您调用 r.text 时使用 r.encoding 的新值

要覆盖这个猜测的编码,只需设置新的编码。在您的情况下,它将是 UTF-8:

>>> res_obj.encoding='UTF-8'

在访问res_obj.text 之前执行此操作,您的代码将正常工作:。

res_obj = requests.get('http://books.toscrape.com/')
 # SET ENCODING MANUALLY
res_obj.encoding='utf-8'
soup = BeautifulSoup(res_obj.text, 'html.parser')
sapiens_price = soup.select('...')
print(sapiens_price[0].text) 

TLDR;在访问res.text之前使用res.encoding='utf-8'

【讨论】:

    【解决方案2】:

    试试这个:

    soup = BeautifulSoup(res_obj.text, 'html.parser')
    
    sapiens_price = soup.select('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(5) > article > div.product_price > p.price_color')
    
    print(sapiens_price[0].text.encode('ascii', 'ignore').decode())
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多