2017-09-25 104 views
1

我无法解析这个网站上正确的HTML:https://nwis.waterdata.usgs.gov/usa/nwis/gwlevels/?site_no=332857117043301解析HTML的网站刮

我想提取行“北纬34°02'48.57”,东经117°02'09.16" 。虽然这在管路862页面的源代码(网页开发工具)显示出来,它不显示,当我通过BeautifulSoup解析。使用lxml的分析器不产生任何所需的结果。

import requests 
import re 
from bs4 import BeautifulSoup 

page = requests.get('https://nwis.waterdata.usgs.gov/usa/nwis/gwlevels/?site_no=340248117020902') 
soup = BeautifulSoup(page.content, 'html.parser') 

print (soup.prettify()) 

我打印声明页面内容不显示纬度/经度线。如何调整我的代码以刮取此信息?

回答

1
import requests 
from bs4 import BeautifulSoup 

html = requests.get('https://nwis.waterdata.usgs.gov/usa/nwis/gwlevels/?site_no=340248117020902') 
soup = BeautifulSoup(html.text, 'lxml') 

data = soup.find_all('div', attrs={'align': 'left'}) 

latitude = ''.join(x.contents[0].split(',')[0] for x in data if 'Latitude' in x.contents[0]) 
longitude = ''.join(x.contents[0].split(',')[1].strip().replace('\n', '') for x in data if 'Longitude' in x.contents[0]) 

print(latitude) 
print(longitude) 

输出:

Latitude  34°02'48.57" 
Longitude 117°02'09.16" NAD83 
1

你是如何寻找特定的内容?您可以使用.findAll('div')找到的数据,然后在标签的文本搜索"Latitude"

import requests 
from bs4 import BeautifulSoup 

page = requests.get('https://nwis.waterdata.usgs.gov/usa/nwis/gwlevels/?site_no=340248117020902') 
soup = BeautifulSoup(page.content, 'html.parser') 

divs = soup.findAll('div') 
texts = [div.text for div in divs] 

for text in texts: 
    if "Latitude" in text: 
     data = text   

在只需要几个解析获得号码,并将其分配给变量的字符串得到的:

>>> print(data) 
Latitude  34°02'48.57", Longitude 117°02'09.16" 
NAD83 
+0

谢谢维尼修斯。我假定当我通过“print(soup(prettify())”打印页面内容时会出现内容。“你能解释为什么它不会显示在那里,但通过findall方法工作? – saoirse

+0

我很高兴(https://meta.stackexchange.com/a/5235)当我尝试你的代码时,它也显示在'print(soup)'中],也可以选择最有帮助的答案并[接受它] ,因为它应该,你有没有试图再次这样做? –

+0

我试过了,打印语句不显示它。我的结果html有814行,这听起来是对的吗? – saoirse

0

这页是纯粹的混乱......只是使用正则表达式(工作示例python2):

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import requests 
import re 


def find(prefix, string): 
    return re.search("{} (?:\s+|)(\d+)\&\#176\;(\d+)\'(\d+)\.(\d+)\"".format(prefix), string) 


def format_result(result): 
    return "{}°{}'{}.{}\"".format(
     result.group(1), 
     result.group(2), 
     result.group(3), 
     result.group(4) 
    ) 

page = requests.get('https://nwis.waterdata.usgs.gov/usa/nwis/gwlevels/?site_no=340248117020902') 
found_lat = find('Latitude', page.content) 
found_lon = find('Longitude', page.content) 
if found_lat and found_lon: 
    latitude = format_result(found_lat) 
    longitude = format_result(found_lon) 
    print('Cords: {} {}'.format(latitude, longitude)) 

结果:

Cords: 34°02'48.57" 117°02'09.16" 

正如你所看到的,你可以从found_lat或found_lon让每个号码就像这样:

print(found_lat.group(1)) # 34 
print(found_lat.group(2)) # 02 
print(found_lat.group(3)) # 48 
print(found_lat.group(4)) # 57 

或纬度或经度这样的:

print(latitude) # 34°02'48.57" 
print(longitude) # 117°02'09.16" 
0

它在那里。如果您运行以下代码,您将获得谷歌纵横,并且您可以将其复制为经度。

divs = soup.find_all('div') 
lat_index = str(divs).find("Latitude") 
lat = str(divs)[lat_index:lat_index+22 // 'Latitude\xa0 34°02\'48.57"'