找不到div类的网络抓取选择器

时间:2020-02-25 23:11:10

标签: python web-scraping

我不熟悉Web抓取,这是我的第一个Web抓取项目,我找不到适合我的soup.select("")的选择器

我想获得“数据电话”(请参见下面的图片),但在div班级中,然后在<a href>之后,这对我来说有点复杂!

我在网上搜索,发现自己必须使用汤。find_all,但这不是很有帮助。有人可以帮我还是给我一个快速提示?谢谢!

我的代码:

import webbrowser, requests, bs4, os

url = "https://www.pagesjaunes.ca/search/si/1/electricien/Montreal+QC"
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text)


result = soup.find('a', {'class', 'mlr__item__cta jsMlrMenu'})
Phone = result['data-phone']
print(Phone)

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法之一是使用soup.select,它允许使用普通的CSS选择器。 https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

soup.select('a.mlr__item_cta.jsMlrMenu')

这应该返回锚点的完整列表,您可以从中选择数据属性。

请注意,我只是在终端上尝试过

from bs4 import BeautifulSoup
import requests

url = 'https://en.wikipedia.org/wiki/Web_scraping'
r  = requests.get(url)

soup = BeautifulSoup(r.text)

result = soup.select('a.mw-jump-link') # or any other selector

print(result)

print(result[0].get("href"))  

您将不得不遍历soup.select的结果,而只是从属性中收集data-phone的值。

更新

好吧,我自己在DOM中进行了搜索,这是我设法检索所有电话数据的方法:

anchores = soup.select('a[data-phone]') 
    for a in anchores:
        print(a.get('data-phone'))

它也仅适用于像这样的数据选择器:soup.select('[data-phone]')

这里是真实的证据: enter image description here

令人惊讶的是,对我来说,它也可以与以下类一起使用:

for a in soup.select('a.mlr__item__cta.jsMlrMenu'):
     print(a.get('data-phone'))

毫不奇怪,我们在第一个选择器中遇到了错字... 找到不同的地方:)

好:a.mlr__item__cta.jsMlrMenu
不好:a.mlr__item_cta.jsMlrMenu