【问题标题】:BeautifulSoup4 not recognizing xml tagBeautifulSoup4 无法识别 xml 标签
【发布时间】:2014-01-02 22:05:01
【问题描述】:

我正在使用 BeautifulSoup4(带有 lxml 解析器)来解析如下所示的 xml:

<?xml version="1.0" encoding="UTF-8" ?>
<data>
<metadata id="8735180"  name="Dauphin Island" lat="30.2500" lon="-88.0750"/>
<observations>
<wl t="2013-12-14 00:00"  v="0.725" s="0.059" f="0,0,0,0" q="v" />
<wl t="2013-12-14 00:06"  v="0.771" s="0.066" f="0,0,0,0" q="v" />
<wl t="2013-12-14 00:12"  v="0.764" s="0.085" f="0,0,0,0" q="v" />

....等

python代码是这样的:

obs_soup = BeautifulSoup(urllib2.urlopen('http://tidesandcurrents.noaa.gov/api/datagetter?product=water_level&application=NOS.COOPS.TAC.WL&begin_date=20131214&end_date=20131216&datum=MSL&station=8735180&time_zone=GMT&units=english&interval=&format=xml),'lxml')

for l in obs_soup.findall('wl'):
    obs.append(l['v'])

我不断收到错误:

for l in obs_soup.findall('wl'):
TypeError: 'NoneType' object is not callable

我尝试了here 的解决方案(除了不是寻找“html”,而是寻找“数据”),但这不起作用。有什么建议吗?

【问题讨论】:

  • 您的代码,如发布的那样,甚至还不足以产生该错误,因为构造 obs_soup 的行中有一个 SyntaxError 来自缺少的引号。请发布SSCCE 而不仅仅是与您的实际代码模糊相似的代码;它使调试变得更加容易。

标签: python xml beautifulsoup


【解决方案1】:

这里有两个问题。


首先,BeautifulSoup中没有findall这样的方法。将其更改为:

for l in obs_soup.find_all('wl'):
    obs.append(l['v'])

……它会起作用的。


那么,为什么你会得到这个TypeError: 'NoneType' object is not callable 而不是更常见的AttributeError?由于 BeautifulSoup 的神奇查找功能——同样可以让您使用obs_soup.wl 作为查找&lt;wl&gt; 的快捷方式,也可以让您使用obs_soup.findall 作为查找&lt;findall&gt; 的快捷方式。因为没有&lt;findall&gt;节点,所以返回None。然后你试图将 None 对象作为一个函数来调用,这当然是无稽之谈。


另外,如果您确实如您所声称的那样从here 复制并粘贴了副本,则不会遇到此问题。该代码使用findAll,大写字母“A”,这是find_all 的已弃用同义词。 (当然,您不应该使用已弃用的同义词。)


其次,您明确要求使用 lxml 的 HTML 解析器而不是其 XML 解析器。不要那样做。见the docs:

BeautifulSoup(markup, ["lxml", "xml"])

由于您没有给我们一个完整的 XML 文档,我不知道这是否会影响到您,或者您是否会碰巧走运。但是你不应该依靠碰巧来获得幸运,因为实际上做正确的事情很容易。

【讨论】:

  • 谢谢!这个问题很有帮助,我相信输入 findAll 或 find_all 会解决它。
  • @RyanSchuster 那么你应该支持这个答案并接受它。不要粗鲁.. :)
  • 对不起。我确实发现这个答案的某些部分很粗鲁。 “但你不应该依靠碰巧来幸运,因为实际上做正确的事情很容易。” --> 因为我只是犯了一个简单的错误,所以可以忽略它......如果你问我,有点居高临下。 “另外,如果你真的像你声称的那样从这里复制并粘贴了副本”-> 从未声称我复制/粘贴了(我显然没有)。我不喜欢我在编造的暗示。 “既然你没有给我们一个完整的 XML 文档”--> NOAA 不允许我链接到 XML,所以我复制/粘贴了足够的内容来说明这一点。
  • @RyanSchuster:发布实际上没有运行的代码,以及示例片段而不是完整的精简示例,并声称您在明确引入错误时“在这里尝试了解决方案”这不在您尝试的解决方案中,所有这些都是在浪费试图帮助您的人以及可能找到您问题的未来搜索者的时间。如果你脸皮太薄,无法处理向你指出的问题,人们就不会愿意帮助你。
猜你喜欢
  • 2013-12-25
  • 2021-12-21
  • 2022-01-05
  • 2013-05-08
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2016-01-17
相关资源
最近更新 更多