2017-08-01 206 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