使用BeautifulSoup和循环提取数据

时间:2017-01-27 07:26:14

标签: python web-scraping beautifulsoup

我需要的数据包含在两个HTML注释之间。第一个是“Data starts here”,第二个是“Data ends here”

我已经想出如何在评论之后获得下一行,但我需要之后的那一行,之后的那一行,直到它点击“数据在此处结束”评论。

这是我为它编写循环的尝试。但是,这只是在评论后进入打印第一行的无限循环。

我不知道两条评论之间会有多少行,所以它需要是一个while循环。有小费吗?我想我很亲密。我只是不知道BeautifulSoup 4了。

import requests
from bs4 import BeautifulSoup, Comment
response = requests.get(url)
soup = BeautifulSoup(response.content, "lxml")

for comment in soup.findAll(text=lambda text:isinstance(text, Comment)):
    if comment.strip() == 'Data starts here':
        while comment.next_element.strip() != 'Data ends here':
            print(comment.next_element.strip())

编辑:

</div>
<p clear="both">
<b>Data at: 0734 UTC 27 Jan 2017</b></p>
<!-- Data starts here --> KJXN 270656Z AUTO 30012KT 10SM SCT026 OVC033 00/M04 A2980 RMK AO2 SNE0558 SLP100   P0000 T00001044<br/><hr width="65%"/> KTEW 270724Z AUTO 27008KT 10SM OVC040 00/M04 A2979 RMK AO2 T00001042<br/><hr width="65%"/>
<!-- Data ends here -->
<br clear="both" style="clear:both;"/>
</div> <!-- awc_main_content -->
</div> <!-- awc_main -->

网站链接:https://www.aviationweather.gov/metar/data?ids=KJXN%20KDTW%20KLAN&format=raw&hours=0&taf=off&layout=on&date=0

1 个答案:

答案 0 :(得分:0)

import requests, bs4

r = requests.get('https://www.aviationweather.gov/metar/data?ids=KJXN%20KDTW%20KLAN&format=raw&hours=0&taf=off&layout=on&date=0')

soup = bs4.BeautifulSoup(r.text, 'lxml')

text_list = soup.find(id="awc_main_content").find_all(text=True)
start_index = text_list.index(' Data starts here ') + 1
end_index = text_list.index(' Data ends here ')
text_list[start_index:end_index]

出:

['\nKJXN 270656Z AUTO 30012KT 10SM SCT026 OVC033 00/M04 A2980 RMK AO2 SNE0558 SLP100\n  P0000 T00001044',
 '\nKDTW 270653Z 28012KT 9SM -SN BKN020 BKN035 OVC065 02/M04 A2980 RMK AO2 SNB08\n  SLP095 P0000 T00171039',
 '\nKLAN 270653Z 27012KT 10SM OVC042 00/M05 A2979 RMK AO2 SLP096 T00001050',
 '\n']

text_list将返回div标记中的所有文字,我们可以使用index获取我们需要的信息的开始和结束索引,然后对列表进行切片。 enter image description here