【问题标题】:How do I get the right element with CSS selectors?如何使用 CSS 选择器获得正确的元素?
【发布时间】:2021-06-18 06:17:42
【问题描述】:

我正在尝试抓取 this page 以获得每平方米的平均价格以及支架。我已经克服了我的第一个障碍(参见 page ,使用 select 而不是 findAll),但现在我无法得到错误的结果。实际上,我想用我的数字获取

  • 元素,但我会使用其他
    • 元素(见下图)。

      我知道它与子节点和

    • 标签后面的小箭头有关,但我无法弄清楚... 那么我该怎么做才能得到文本“2 992 €”和括号文本“1962 € à 4 158 €”???

      这是我的代码

      import requests
      from bs4 import BeautifulSoup as bs
      
      res=requests.get("https://www.meilleursagents.com/prix-immobilier/marseille-13000/")
      soup=bs(res.text,"html.parser")
      infos=soup.select("li",class_="big-number")
      print(infos)
      

      我得到了什么(上)

      我想要什么(上)

【问题讨论】:

    标签: python html web-scraping beautifulsoup css-selectors


    【解决方案1】:

    它可能从服务器上指定的列表中寻找有效的浏览器ua,并且还有unicode要处理

    import requests
    from bs4 import BeautifulSoup
    import unicodedata
    import re
    
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}  
    r = requests.get('https://www.meilleursagents.com/prix-immobilier/marseille-13000/', headers = headers)
    soup = BeautifulSoup(r.text, "lxml")
    for i in soup.select('.prices-summary__price-range'):
        print([re.sub('\n\s+', '', unicodedata.normalize('NFKD', j.text.strip())) for j in i.select('li:nth-child(n+2):nth-child(-n+3)')])
    

    【讨论】:

    • 非常感谢您的回答!!尽管有反刮擦机制,我仍然可以得到正确的值!
    【解决方案2】:

    转到开发工具,然后选择元素。然后单击复制为 css 选择器,浏览器会自动为您提供正确的 css 选择器。或者,您可以使用 xpath。

    【讨论】:

    • 我将
    • 行复制为 css 选择器并将其粘贴到我的代码中:infos=soup.select("prices-summary-sell > div.prices-summary__sell-prices--container > div.prices-summary__apartment-prices > ul > li.big-number") 但是它返回一个空列表(或使用 find 方法时返回 None )对不起@OctoppuSS7 我是初学者,所以也许我没有很好地应用你的建议
  • 如果你是初学者,这不是最好的解决方案,所以我会选择其他的。
  • 这是否可能有这行代码......我想我可以试着弄清楚你对我在问题中提到的问题有任何想法(在 cf.page ) @OctopuSS7
  • 【解决方案3】:

    这是一个解决方案,您可以尝试使用父标签ul 而不是li

    for ul in soup.find_all("ul", {"class": "prices-summary__price-range"}):
        for li in ul.find_all("li"):
            if li.string:
                print(li.string.strip())
    

    Prix m2 moyen
    2 168 €
    de 
        
            1 421 €
        
     à 
        
            3 011 €
    
    ....
    

    【讨论】:

    • 这很奇怪。我复制了您的代码并将其粘贴在 soup=bs(res.text,"html.parser") 之后,但没有打印任何内容...
    • hmm.. 这很奇怪,只需 print(res.text) 并查看响应是否包含所需的内容。
    • 我认为问题不是打印指令,而是循环,因为在 if 指令之后我添加了 print("a") 并且它从不打印字母 a 所以 if 从未使用过跨度>
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签