【问题标题】:How to extract URL from an HTML如何从 HTML 中提取 URL
【发布时间】:2018-01-08 14:37:45
【问题描述】:

我是网络抓取的新手。我这样做如下

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”就是这个原因)。你能帮帮我吗?

【问题讨论】:

    标签: python regex beautifulsoup urlopen


    【解决方案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)
    

    【讨论】:

    • 我确实喜欢这个,但我得到了足够的 2000 只是 '?2000',而不是 ?2000_exp#10sep 我想要的
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2011-07-09
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多