【问题标题】:How to get that one href link inside the selected block with BeautifulSoup如何使用 BeautifulSoup 在选定块内获取一个 href 链接
【发布时间】:2019-07-15 21:52:10
【问题描述】:

我正在尝试使用 BeautifulSoup (Python 3.7) 选择块内的特定链接。如何在选定块中选择特定链接?

这是我目前正在做的工作,我以前使用过 selenium,但我认为还没有必要。

 from bs4 import BeautifulSoup
 import requests

 base_url = 'http://www.shop.pr'

 shop_urls = {'econo' : '/econo/shoppers' , 
              'pueblo' : '/pueblo/shoppers' , 
              'costco' : '/costco/shoppers' , 
              'econo' : '/econo/shoppers'}

 selected_shop = 'econo'
 append_to_url = shop_urls.get(selected_shop)

 url = base_url + append_to_url

 page = requests.get(url)

 soup = BeautifulSoup(page.text , 'html.parser')

 toString = str(soup.prettify)

 file = open('page.txt','w+')
 file.write(toString)

 wrapper = soup.find("div", {"class": "wrapper"})
 sub_wrapper = wrapper.find('div' , {'class' : 'breadcrumb-holder' })

 print(sub_wrapper)

在深入挖掘代码之后,我得到了这个:

<div class="breadcrumb-holder">
<div data-react-class="SliderPageLink" data-react-

props='{"baseLink":"/econo/shoppers/donde-mejor-se-compra-20190711/4878/product-list-view","page":1,"linkText":"VER PRODUCTOS","sliderSelector":"#shopper-terminal .catalog-view .slider","show":true,"back":false}'></div>
<ul class="breadcrumb">
<li>
<a href="/">Shoppers</a>
</li>
<li>
<a href="/econo/shoppers?clientid=1"><strong>Econo</strong>
</a></li>
</ul>
</div>

后来试图得到: "/econo/shoppers/donde-mejor-se-compra-20190711/4878/product-list-view" 但它返回“无”。

【问题讨论】:

标签: python html beautifulsoup screen-scraping


【解决方案1】:

如果我正确理解您在寻找什么,这应该可以:

首先,

import json

然后,将以下代码添加到代码的 wrapper 部分:

target = sub_wrapper.find('div')
td = json.loads(target['data-react-props'])
print(td['baseLink'])

输出:

'/econo/shoppers/donde-mejor-se-compra-20190711/4878/product-list-view'

【讨论】:

    【解决方案2】:

    data-react-props 你试图得到的似乎是一个有效的 python 字典。如果是这样,我建议使用ast.literal_eval 将其转换为字典,然后获取您想要的任何内容。

    导入 ast # 你的代码在这里 drp = wrapper.find('div' , {'data-react-class': 'SliderPageLink'})['data-react-props'] drp_dict = ast.literal_eval(drp.replace(':true', ':True').replace(':false', ':False')) base_link = drp_dict['baseLink'] # 你的链接在这里

    使用ast.literal_eval 似乎是安全的,因为它的文档说

    关于 ast 模块中函数 literal_eval 的帮助: 文字评估(节点或字符串) 安全地评估表达式节点或包含 Python 的字符串 表达。提供的字符串或节点只能包含以下内容 Python 文字结构:字符串、数字、元组、列表、字典、布尔值、 和无。

    但是,可能需要对字符串进行一些更改,例如true 不是 python 表达式。

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多