2017-08-01 2 views
0

Ich bin ein Neuling im Web Scraping. Ich tun, wie untenWie URL aus einem HTML extrahieren

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) 

und

[] 

Mein Ziel bekommen, ist dieses Fragment

<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>"; 

Und ich versuche, das Ergebnis wie folgt zu erhalten

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

Von 2000 zu diesem Moment (so '20' in "r'\b?20\b'" ist aus diesem Grund). Kannst du mir bitte helfen?

Antwort

2

Präliminarien:

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

dies getan zu haben, es scheint, dass der direkteste Weg, um das script Element zu identifizieren, könnte sein, zu verwenden:

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

scripts erweist sich jedoch als eine leere Liste. (Ich weiß nicht warum.)

Der grundlegende Ansatz funktioniert, wenn ich ein anderes Ziel innerhalb des Skripts wählen, aber es scheint, es ist unsicher, auf die genaue Formatierung des Inhalts von Javascript-Skript-Element abhängen.

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

Dennoch könnte dies gut genug für Sie sein. Bitte beachten Sie, dass das Skript die change Funktion am Ende verworfen hat.

Ein sicherer Ansatz könnte sein, nach dem enthaltenen table Element zu suchen, dann das zweite td Element in diesem und schließlich die script innerhalb dieser.

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

Auch hier müssen Sie die Funktion verwerfen.

1

können Sie get('attribute') verwenden und dann die Ergebnisse filtern, wenn nötig:

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

Ich mochte das, aber ich bekam reichlich für '2000' nur '2000', nicht?' 2000_exp # 10sep' wie ich will – Edward

Verwandte Themen