无法使用Beautiful Soup 4从对象中提取信息

时间:2017-08-26 14:26:02

标签: python-3.x web-scraping beautifulsoup

我正在(抓住网站)工作(第一次)。我试图从网站拉出纬度(十进制度)。我设法拔出包含信息的正确父节点,但我仍然坚持如何从中提取实际数字。我所做的所有搜索只告诉我如果我知道字符串(我不知道)或字符串是否在子节点中,它是如何将其拉出来的。任何帮助都会很棒。

这是我的代码:

a_string = soup.find(string="Latitude in decimal degrees")

a_string.find_parents("p")
Out[46]: [<p><b>Latitude in decimal degrees</b><font size="-2">
(<a     href="definitions.html#LAT" target="_blank"><u>see definition</u></a>)
</font><b>:</b> 35.7584895</p>]

test = a_string.find_parents("p")

print(test)
[<p><b>Latitude in decimal degrees</b><font size="-2"> (<a 
href="definitions.html#LAT" target="_blank"><u>see definition</u></a>)</font>
<b>:</b> 35.7584895</p>]

我需要拔出35.7584895并将其保存为对象,以便将其附加到数据集中。

我正在使用Beautiful Soup 4和python 3

1 个答案:

答案 0 :(得分:1)

首先要注意的是,由于您使用了find_parents方法(复数),test是一个列表。你只需要第一项。

我会通过这样做模拟你的情况。

>>> import bs4
>>> HTML = '<p><b>Latitude in decimal degrees</b><font size="-2"> (<a href="definitions.html#LAT" target="_blank"><u>see definition</u></a>)</font><b>:</b> 35.7584895</p>'
>>> item_soup = bs4.BeautifulSoup(HTML, 'lxml')

恢复文本内容的最简单方法是执行此操作:

>>> item_soup.text
'Latitude in decimal degrees (see definition): 35.7584895'

但是,你想要这个号码。你可以通过各种方式得到这个,其中两个出现在我的脑海中。我将前一个语句的结果分配给str,以便我可以操作结果。

>>> str = item_soup.text

一种方法是搜索冒号。

>>> str[1+str.rfind(':'):].strip()
'35.7584895'

另一种是使用正则表达式。

>>> bs4.re.search(r'(\d+\.\d+)', str).groups(0)[0]
'35.7584895'