【问题标题】:Python -- Beautiful Soup -- Returning Information if a tag is empty or has valuesPython -- Beautiful Soup -- 如果标签为空或有值,则返回信息
【发布时间】:2020-06-23 11:42:46
【问题描述】:

我决定学习 Python,因为我现在有更多时间(由于大流行)并且一直在自学 Python。

我正在尝试从网站上获取税率,并且几乎可以获得我需要的一切。下面是来自我的 Soup 变量以及相关 Python 部分的代码的 sn-p。

我遇到的困难是我找到了option 标签以及空的data-alias ("")。但是,如果您查看下面的代码,就会发现一些data-alias 阶段不是空的(请参阅阿联酋或英国)- 它们列出了一些国家/地区。

我也希望从中获取 data-url 和国家/地区名称。

当我丢失一些必需的信息时,如何编码以获得空标签和非空标签?

谢谢, 赛斯

我的代码:

import requests
from bs4 import BeautifulSoup
import re

l=[]
r = requests.get("https://taxsummaries.pwc.com/")
c=r.content
soup = BeautifulSoup(c, "html.parser")
all = soup.find_all("option", {"data-alias":""})
    

网站信息:

<option data-alias="" data-id="c9ddd85e-f3dc-4661-a4cb-8101f4644871" data-url="https://taxsummaries.pwc.com:443/uganda">Uganda</option>
<option data-alias="" data-id="d21e8abe-784c-4617-a90e-5369b49a202f" data-url="https://taxsummaries.pwc.com:443/ukraine">Ukraine</option>
<option data-alias="UAE" data-id="9e3f5e7b-f110-47dd-95d8-3d8160466e4a" data-url="https://taxsummaries.pwc.com:443/united-arab-emirates">United Arab Emirates</option>
<option data-alias="Great Britain
UK
Britain
Whales
Northern Ireland
England" data-id="3c42b2a9-7ed6-4b19-821d-5d78ef6f2b5d" data-url="https://taxsummaries.pwc.com:443/united-kingdom">United Kingdom</option>

【问题讨论】:

  • 您好 - 非常感谢 Seth 提出这个好问题 - 这是许多 python 主题的有趣途径。谢谢 - 继续你的 Python 之旅!

标签: python beautifulsoup html-parsing


【解决方案1】:

您需要使用{"data-alias":True}。你可以试试:

import requests
from bs4 import BeautifulSoup
l=[]
r = requests.get("https://taxsummaries.pwc.com/")
c=r.content
soup = BeautifulSoup(c, "html.parser")
options = soup.find_all('option', {"data-alias":True})
for each in options:
    print("country_name : " + str(each.text), " data-url : " + str(each['data-url']))

输出将是:

country_name : Albania  data-url : https://taxsummaries.pwc.com:443/albania
country_name : Algeria  data-url : https://taxsummaries.pwc.com:443/algeria
country_name : Angola  data-url : https://taxsummaries.pwc.com:443/angola
country_name : Argentina  data-url : https://taxsummaries.pwc.com:443/argentina
country_name : Armenia  data-url : https://taxsummaries.pwc.com:443/armenia
country_name : Australia  data-url : https://taxsummaries.pwc.com:443/australia
country_name : Austria  data-url : https://taxsummaries.pwc.com:443/austria
country_name : Azerbaijan  data-url : https://taxsummaries.pwc.com:443/azerbaijan
country_name : Bahrain  data-url : https://taxsummaries.pwc.com:443/bahrain
country_name : Barbados  data-url : https://taxsummaries.pwc.com:443/barbados
country_name : Belarus  data-url : https://taxsummaries.pwc.com:443/belarus
country_name : Belgium  data-url : https://taxsummaries.pwc.com:443/belgium
country_name : Bermuda  data-url : https://taxsummaries.pwc.com:443/bermuda
country_name : Bolivia  data-url : https://taxsummaries.pwc.com:443/bolivia
country_name : Bosnia and Herzegovina  data-url : https://taxsummaries.pwc.com:443/bosnia-and-herzegovina
country_name : Botswana  data-url : https://taxsummaries.pwc.com:443/botswana
country_name : Brazil  data-url : https://taxsummaries.pwc.com:443/brazil
country_name : Bulgaria  data-url : https://taxsummaries.pwc.com:443/bulgaria


and so on ......

获取list

for each in options:
    l.append( str(each.text)+ " : " + str(each['data-url']))
print(l)

输出将是:

['Albania : https://taxsummaries.pwc.com:443/albania', 'Algeria : https://taxsummaries.pwc.com:443/algeria', 'Angola : https://taxsummaries.pwc.com:443/angola', 'Argentina : https://taxsummaries.pwc.com:443/argentina', 'Armenia : https://taxsummaries.pwc.com:443/armenia', 'Australia : https://taxsummaries.pwc.com:443/australia', 'Austria : https://taxsummaries.pwc.com:443/austria', 'Azerbaijan : https://taxsummaries.pwc.com:443/azerbaijan', 'Bahrain : https://taxsummaries.pwc.com:443/bahrain', 'Barbados : https://taxsummaries.pwc.com:443/barbados', 'Belarus : https://taxsummaries.pwc.com:443/belarus', 'Belgium : https://taxsummaries.pwc.com:443/belgium', 'Bermuda : https://taxsummaries.pwc.com:443/bermuda', 'Bolivia : https://taxsummaries.pwc.com:443/bolivia', 'Bosnia and Herzegovina : https://taxsummaries.pwc.com:443/bosnia-and-herzegovina', 'Botswana : https://taxsummaries.pwc.com:443/botswana', 'Brazil : https://taxsummaries.pwc.com:443/brazil', 'Bulgaria : https://taxsummaries.pwc.com:443/bulgaria', 'Cabo Verde : https://taxsummaries.pwc.com:443/cabo-verde', 'Cambodia : https://taxsummaries.pwc.com:443/cambodia', 'Cameroon, Republic of : https://taxsummaries.pwc.com:443/republic-of-cameroon',


and so on............]

【讨论】:

  • 谢谢胡马云!效果很好!我猜 True 语句只是意味着 - 返回所有数据别名标签?我猜想这会在任何类似的情况下工作吗?
  • @SethMoskowitz 很高兴提供帮助,如果有帮助,请考虑投票和/或接受。stackoverflow.com/help/someone-answers
  • 非常感谢这个有趣的答案 - 你太棒了
【解决方案2】:

这是一种方式,它还将向您介绍一些可能感兴趣的其他 Python 主题(正如您提到的那样,您正在学习):

all = soup.find_all("option", {"data-alias":True})

results=[]
for item in all:
   results.append({item.text:item['data-url']})

评论:

  • soup.find_all("option", {"data-alias":True}) - 这将找到所有 具有data-alias 属性的option 标签,无论其属性如何 价值
  • resultslist 将范围内的记录添加到 (results.append)
  • {item.text:item['data-url']} - 这是一个 dictionary 其中 key 是国家名称 (item.text) 和 value 是 data-url 属性 (item['data-url'])

编写结果列表的等效(更紧凑)方式是使用list comprehensions 的概念。

results=[{item.text:item['data-url']} for item in all]

【讨论】:

  • 谢谢!我将审查您的代码,并从中了解我能做什么。感谢您花时间写这篇文章。
  • 嗨,亲爱的 Obuz,非常感谢您提供的答案以及您在其中提供的大量附加信息!太好了!!!
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多