2017-08-01 208 views
0

我是网络抓取的新手。我做如下如何从HTML提取URL

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re 
html = urlopen("http://chgk.tvigra.ru/letopis/?2016/2016_spr#27mar") 
soup = BeautifulSoup(html, "html.parser") 
res = soup.find_all('a', {'href': re.compile("r'\b?20\b'")}) 
print (res) 

,并得到

[] 

我的目标是这个片段

<script language="javascript" type="text/javascript"> 
cont = new Array(); 
count = new Array(); 
for (i=1979; i <=2015; i++){count[i]=0}; 
cont[1979] = "<li><a href='?1979_1#24jan'>24 января</a>" + 

..............

cont[2016] = "<li><a href='?2016/2016_spr#cur'>Весенняя серия</a>" + 
     "<li><a href='?2016/2016_sum#cur'>Летняя серия</a>" + 
     "<li><a href='?2016/2016_aut#cur'>Осенняя серия</a>" + 
     "<li><a href='?2016/2016_win#cur'>Зимняя серия</a>"; 

而我试图得到这样的结果

'?2016/2016_spr#cur' 
'?2016/2016_sum#cur' 
'?2016/2016_aut#cur' 
'?2016/2016_win#cur' 

从2000年到现在(所以'20'在"r'\b?20\b'"就是这个原因)。你能帮我吗?

回答

2

预赛:

>>> import requests 
>>> import bs4 
>>> page = requests.get('http://chgk.tvigra.ru/letopis/?2016/2016_spr#27mar').content 
>>> soup = bs4.BeautifulSoup(page, 'lxml') 

已经做到了这一点也许看起来识别script元素的最简单的方法可能是使用这个:

>>> scripts = soup.findAll('script', text=bs4.re.compile('cont = new Array();')) 

但是,scripts证明是一个空列表。 (我不知道为什么)

基本的方法是有效的,如果我在脚本中选择不同的目标,但它会出现依赖于JavaScript脚本元素的确切格式的内容是不安全的。

>>> scripts = soup.find_all(string=bs4.re.compile('i=1979')) 
>>> len(scripts) 
1 

不过,这可能对你来说已经足够好了。请注意,该脚本末尾的change函数将被丢弃。

一个更安全的方法可能是寻找包含table元素,然后在第二个td元素内,最后在script内。

>>> table = soup.find_all('table', class_='common_table') 
>>> tds = table[0].findAll('td')[1] 
>>> script = tds.find('script') 

同样,您将需要放弃功能change

1

您可以使用get('attribute'),然后根据需要过滤结果:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 

html = urlopen("http://chgk.tvigra.ru/letopis/?2016/2016_spr#27mar") 
soup = BeautifulSoup(html, "html.parser") 
res = [link.get('href') for link in soup.find_all('a')] 
print (res) 
+0

我确实喜欢这个,但是我为'2000'获得了充足的'2000',而不是'2000_exp#10sep',因为我想要 – Edward