gpt4 book ai didi

python - Beautiful Soup - `findAll` 没有捕获 SVG (`ElementTree` 中的所有标签)

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:30 25 4
gpt4 key购买 nike

我试图通过修改 SVG map 生成等值线图描绘了美国的所有县。 Flowing Data 捕获了基本方法.由于 SVG 基本上只是 XML,因此该方法利用了 BeautifulSoup解析器。

问题是,解析器不会捕获 SVG 文件中的所有 path 元素。以下仅捕获了 149 条路径(超过 3000 条路径):

#Open SVG file
svg=open(shp_dir+'USA_Counties_with_FIPS_and_names.svg','r').read()

#Parse SVG
soup = BeautifulSoup(svg, selfClosingTags=['defs','sodipodi:namedview'])

#Identify counties
paths = soup.findAll('path')

len(paths)

但是,我知道,从物理检查和 ElementTree 的事实来看,还有更多存在方法使用以下例程捕获 3,143 个路径:

#Parse SVG
tree = ET.parse(shp_dir+'USA_Counties_with_FIPS_and_names.svg')

#Capture element
root = tree.getroot()

#Compile list of IDs from file
ids=[]
for child in root:
if 'path' in child.tag:
ids.append(child.attrib['id'])

len(ids)

我还没有想出如何从 ElementTree 对象中以一种不会完全困惑的方式编写。

#Define style template string
style='font-size:12px;fill-rule:nonzero;stroke:#FFFFFF;stroke-opacity:1;'+\
'stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;'+\
'stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel;fill:'

#For each path...
for child in root:
#...if it is a path....
if 'path' in child.tag:
try:
#...update the style to the new string with a county-specific color...
child.attrib['style']=style+col_map[child.attrib['id']]
except:
#...if it's not a county we have in the ACS, leave it alone
child.attrib['style']=style+'#d0d0d0'+'\n'

#Write modified SVG to disk
tree.write(shp_dir+'mhv_by_cty.svg')

上面的修改/写入例程产生了这个怪物:

Ugly Median Home Value by County

我的主要问题是:为什么 BeautifulSoup 未能捕获所有 path 标签?其次,为什么用 ElementTree 对象修改的图像会进行所有这些课外事件?任何建议将不胜感激。

最佳答案

您需要执行以下操作:

  • 升级到 beautifulsoup4 :

    pip install beautifulsoup4 -U
  • 导入为:

    from bs4 import BeautifulSoup
  • 安装最新的lxml模块:

    pip install lxml -U
  • 明确指定 lxml 作为解析器:

    soup = BeautifulSoup(svg, 'lxml')

演示:

>>> from bs4 import BeautifulSoup
>>>
>>> svg = open('USA_Counties_with_FIPS_and_names.svg','r').read()
>>> soup = BeautifulSoup(svg, 'lxml')
>>> paths = soup.findAll('path')
>>> len(paths)
3143

关于python - Beautiful Soup - `findAll` 没有捕获 SVG (`ElementTree` 中的所有标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com