我需要的数据包含在两个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 -->
答案 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
获取我们需要的信息的开始和结束索引,然后对列表进行切片。