如何解决BeautifulSoup find_all返回空字符串列表
我正在尝试从rightmove.co.uk获取所有价格,作为一项学习练习,以便更好地了解网络抓取。
这是我的代码:
class RightmoveScraper:
def fetch(self,url):
response = requests.get(url)
print('Status code : %s' % response.status_code)
return response
def parse(self,response):
soup = BeautifulSoup(response,'lxml')
prices = [price.text for price in soup.find_all(
'div',{'class': 'propertyCard-priceValue'})]
print(prices)
def run(self):
response = self.fetch(
'https://www.rightmove.co.uk/overseas-property-for-sale/Paris.html')
self.parse(response.text)
运行刮板时,这是打印出来的内容:
['','','']
而不是获取价格。
有人可以指导我解决我做错的事情并给我解决方法吗?
解决方法
在抓取网站时,切勿依赖浏览器告诉您的内容(至少在HTML元素方面)。浏览器运行可填充HTML元素的JS脚本。
如果仅在文件中打印response.text
,然后快速浏览一下。您会看到<div class="propertyCard-priceValue">
标签确实是空的。背后的原因可能是价格是在加载时从JS脚本填充的。
不幸的是,解决此类问题的唯一方法是使用python代码运行浏览器。建议您看看selenium
的工作原理。
您要查找的信息位于网页的源代码中。
但是,它作为javascript数据结构存储在路径/html/body/script[1]
下
您要做的就是阅读脚本的内容(这只是一个JSON),将JSON加载到python dict中。
有关数据,请参见https://pastebin.com/rzG9YL0y。
以下工作代码:
import json
import pprint
import requests
r = requests.get('https://www.rightmove.co.uk/overseas-property-for-sale/Paris.html')
if r.status_code == 200:
search_term = '<script>window.jsonModel = '
body = r.content.decode('utf-8')
left_idx = body.find(search_term)
right_idx = body.find('</script>',left_idx)
offset = len(search_term)
data_str = body[left_idx + offset:right_idx]
# data holds the 'data model' of the page. the prices are there as well
data = json.loads(data_str)
props = data['properties']
for entry in props:
_id = entry['id']
price = entry['price']['amount']
print('{} --> {}'.format(_id,price))
输出
81919186 --> 899000
94229627 --> 1930000
94115438 --> 5300000
94115432 --> 1490000
91433144 --> 840000
90987107 --> 758000
90987110 --> 935000
90987101 --> 1630000
90987104 --> 3064000
90987092 --> 1274500
90987098 --> 1981000
90834383 --> 3344000
90834386 --> 1140000
90834392 --> 431000
90834368 --> 630000
90666347 --> 452000
88743806 --> 5194000
90665516 --> 6250000
90665774 --> 1795000
73687471 --> 1890000
90665348 --> 10500000
69017641 --> 930000
69017644 --> 930000
90665852 --> 1790000
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。