如何从 HTML 中提取 URL
How to extract URL from an HTML
我是网络抓取方面的新手。我做如下
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 年至今(所以 "r'\b?20\b'"
中的“20”就是这个原因)。你能帮帮我吗?
您可以使用 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)
预赛:
>>> 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
。
我是网络抓取方面的新手。我做如下
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 年至今(所以 "r'\b?20\b'"
中的“20”就是这个原因)。你能帮帮我吗?
您可以使用 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)
预赛:
>>> 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
。