我想从页面387
中获取值https://house.leju.com/dl147961/
。
res = requests.get('https://house.leju.com/dl147961/')
soup = BeautifulSoup(res.text, 'lxml')
num = soup.find('h2', {'class':'clearfix'}).find('em', {'class':'new_font'}).text
令人惊讶的是,num
是628
!
即使只是复制并在浏览器中保存值,结果也是628
。
正确的方法是什么?
答案 0 :(得分:1)
这是因为它们使用的非标准字体使用字符数字。如果您查看该站点,您会发现实际上是628:
<em class="new_font">628</em>
但是,如果您查看new_class
的定义,就会发现它映射字符:
.new_font {
font-family: "new_font","\5fae\8f6f\96c5\9ed1",Microsoft JhengHei,"\534e\6587\7ec6\9ed1",STHeiti,MingLiu,Serif!important;
}
值628仅表示字符索引6等于3,字符索引2等于8,依此类推。因此,您需要将此字体导入python,然后使用其索引以获取实值的方式与通过数字引用ASCII字符的方式相同。或者,您可以自己创建一个快速且肮脏的地图。只需右键单击并使用chrome开发人员工具来动态更改em
标签的值,以查看其将显示与我一样的值。下面是映射:
1234567890 = 9802431765
在左侧,您会从右侧的请求中获得显示在网站上的方式的一位数字。因此,您需要将数字分成几个数字,然后根据我提供的地图对每个数字进行转换。
所以628:
6->3
2->8
8->7
完整的示例:
import requests
from bs4 import BeautifulSoup
mapping ={
"1":"9",
"2":"8",
"3":"0",
"4":"2",
"5":"4",
"6":"3",
"7":"1",
"8":"7",
"9":"6",
"0":"5"
}
res = requests.get('https://house.leju.com/dl147961/')
soup = BeautifulSoup(res.text, 'lxml')
num = soup.find('h2', {'class':'clearfix'}).find('em', {'class':'new_font'}).text
result = ''
for d in num:
result += mapping[d]
print(result)