我有一个BeautifulSoup问题,希望你可以帮助我。
目前,我的网站上有很多链接。链接指向包含链接的项目数据的页面。如果你想查看它,就是这个:http://ogle.astrouw.edu.pl/ogle4/ews/ews.html。我最终想要完成的是打印出标有“N”的数据的链接。一开始可能并不明显,但如果你仔细观察网站,一些数据在他们的Star No之后有'N',而其他数据则没有。之后,我使用该链接下载包含该数据所需信息的文件。该网站非常方便,因为下载URL只会从数据更改为数据,所以我只需要更改URL的一部分,您将在下面的代码中看到。
我目前已经完成了数据下载部分。但是,这就是你进来的地方。目前,我需要输入我想要的BLG活动的识别号码。 (在您查看下面的代码后,这将变得明显。)但是,随着时间的推移,网站会不断更新,并且必须手动搜索“N”事件会占用不必要的时间。我希望Python代码能够为我做到这一点。我对这个主题的最初想法是,我可以通过文本搜索所有N的BeautifulSoup,但是我遇到了一些关于完成它的问题。我觉得我对BeautifulSoup不够熟悉,无法完成我想要完成的任务。一些帮助将不胜感激。
我目前的代码如下。我已经提出了一系列以'N'标签为例的BLG事件。
#Retrieve .gz files from URLs
from urllib.request import urlopen
import urllib.request
from bs4 import BeautifulSoup
#Access website
URL = 'http://ogle.astrouw.edu.pl/ogle4/ews/ews.html'
soup = BeautifulSoup(urlopen(URL))
#Select the desired data numbers
numbers = list(range(974,998))
x=0
for i in numbers:
numbers[x] = str(i)
x += 1
print(numbers)
#Get all links and put into list
allLinks = []
for link in soup.find_all('a'):
list_links = link.get('href')
allLinks.append(list_links)
#Remove None datatypes from link list
while None in allLinks:
allLinks.remove(None)
#print(allLinks)
#Remove all links but links to data pages and gets rid of the '.html'
list_Bindices = [i for i, s in enumerate(allLinks) if 'b' in s]
print(list_Bindices)
bLinks = []
for x in list_Bindices:
bLinks.append(allLinks[x])
bLinks = [s.replace('.html', '') for s in bLinks]
#print(bLinks)
#Create a list of indices for accessing those pages
list_Nindices = []
for x in numbers:
list_Nindices.append([i for i, s in enumerate(bLinks) if x in s])
#print(type(list_Nindices))
#print(list_Nindices)
nindices_corrected = []
place = 0
while place < (len(list_Nindices)):
a = list_Nindices[place]
nindices_corrected.append(a[0])
place = place + 1
#print(nindices_corrected)
#Get the page names (without the .html) from the indices
nLinks = []
for x in nindices_corrected:
nLinks.append(bLinks[x])
#print(nLinks)
#Form the URLs for those pages
final_URLs = []
for x in nLinks:
y = "ftp://ftp.astrouw.edu.pl/ogle/ogle4/ews/2017/"+ x + "/phot.dat"
final_URLs.append(y)
#print(final_URLs)
#Retrieve the data from the URLs
z = 0
for x in final_URLs:
name = nLinks[z] + ".dat"
#print(name)
urllib.request.urlretrieve(x, name)
z += 1
#hrm = urllib.request.urlretrieve("ftp://ftp.astrouw.edu.pl/ogle/ogle4/ews/2017/blg-0974.tar.gz", "practice.gz")
这段代码花了我相当长的时间来编写,因为我不是专业的程序员,也不是BeautifulSoup或URL操作方面的专家。事实上,我使用MATLAB而不是Python。因此,我倾向于用MATLAB来思考,这转化为效率较低的Python代码。但是,效率不我在这个问题中搜索的内容。我可以等待额外的五分钟让我的代码完成,如果这意味着我理解发生了什么并且可以完成我需要完成的任务。感谢您提供的任何帮助!我意识到这是一个相当多方面的问题。
答案 0 :(得分:0)
这应该这样做:
from urllib.request import urlopen
import urllib.request
from bs4 import BeautifulSoup
#Access website
URL = 'http://ogle.astrouw.edu.pl/ogle4/ews/ews.html'
soup = BeautifulSoup(urlopen(URL), 'html5lib')
在这里,我使用html5lib
来解析网址内容。
接下来,我们将查看表格,如果明星名称中包含'N'
,则会提取链接:
table = soup.find('table')
links = []
for tr in table.find_all('tr', {'class' : 'trow'}):
td = tr.findChildren()
if 'N' in td[4].text:
links.append('http://ogle.astrouw.edu.pl/ogle4/ews/' + td[1].a['href'])
print(links)
输出:
['http://ogle.astrouw.edu.pl/ogle4/ews/blg-0974.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0975.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0976.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0977.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0978.html',
...
]