python - 为什么没有打印出评论?我使用了正确的 HTML 元素吗?

标签 python html web-scraping beautifulsoup

我正在尝试打印 yelp 中针对特定餐厅的评论的段落部分。我不确定我是否正确实现了 BeautifulSoup 函数。 我提供下面的代码。

我见过类似的 soup.find_all 工作实现。我认为这是我在 attrs 中添加的内容的问题。我认为最好找到所有具有相同类名并包含评论的 div 元素。

for i in range (0,500,20):
    url = 'https://www.yelp.com/biz/m%C3%A9m%C3%A9-mediterranean-new-york-4?start={}'.format(i)
    response = requests.get(url, headers=headers, verify=False).text
    soup = BeautifulSoup(response, "lxml")
    for s in soup.find_all('div', attrs={'span class': 'lemon--span__373c0__3997G'}):
      re = s.find('p', attrs={'lang': 'en'})
      print(re.text)

现在,当我运行此代码时,它不会打印出任何错误。它只说:“进程已完成,退出代码为 0” 这让我相信我没有正确使用正确的元素或者搞乱了 for 循环中的逻辑。

最佳答案

html 看起来很多都是动态的,例如类名等会随着时间的推移而改变。我将从 script 标签中获取评论信息并使用 json 库进行解析

import requests,json
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.yelp.com/biz/m%C3%A9m%C3%A9-mediterranean-new-york-4')
soup = bs(r.content, 'lxml')
data = json.loads(soup.select_one('[type="application/ld+json"]').text.strip())
print(data)
<小时/>

如果你想取消 bs4,你可以通过正则表达式输出所需的字符串。

import requests,json, re

r = requests.get('https://www.yelp.com/biz/m%C3%A9m%C3%A9-mediterranean-new-york-4')
p = re.compile(r'({"aggregateRating.+?(?=<))', re.DOTALL)
data = json.loads(p.findall(r.text)[0].strip())

enter image description here

关于python - 为什么没有打印出评论?我使用了正确的 HTML 元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701877/

相关文章:

python - Scrapy 选择器返回页面上的所有内容而不是相对的

python - 如何在多线程环境中使用requests-html渲染异步页面?

python - 我得到一个无,每一行

python - 在项目符号数据或列出数据的情况下如何使用 nltk 句子标记器?

html - html列表项和段落之间的视觉差异

javascript - 如何使用 Chrome 控制台导航到 bing.com 并输入搜索文本?

python - 我如何开始使用 python 在 web Scrapy 中编写单元测试?

python - 在每个数据点处带有对齐注释的散点图

python - 近似比较大型 numpy 数组中值的最快方法?

html - Electron :自定义标题栏:当光标离开应用程序时,按钮不会将其CSS属性恢复为正常(鼠标悬停后)