• 4
  • 新人请关照

python里面使用BS4爬取的页面代码里面有部分XML数据如何提取

python爬过过来的html数据里面有一段数据,我想取里面的链接地址和标题,以及发布的日期,但是使用find_all()获取不到里面的数据,应该如何获取?
爬过来的数据格式如下:


<record><![CDATA[
<tr><td height="26" align="left" style="border-bottom:dashed 1px #ccc"><span style="padding-right:8px;"><img src="/picture/0/s1609271437127167930.gif" align="absmiddle" border="0"></span><a  style="font-size:12px;" href='/art/2018/1/2/art_275_32953.html' class='bt_link' title='考核合格名单的通知' target="_blank">2017年度学科带头人考核合格名单的通知</a></td><td width="80" align="center" class="bt_time" style="border-bottom:dashed 1px #ccc">[2018-01-02]</td></tr>]]></record>
阅读 2.5k
评论
    2 个回答
    from bs4 import BeautifulSoup
    
    a = """<record><![CDATA[ \
    <tr><td height="26" align="left" style="border-bottom:dashed 1px #ccc"><span style="padding-right:8px;"> \
    <img src="/picture/0/s1609271437127167930.gif" align="absmiddle" border="0"></span>2017年度学科带头人考核 \
    合格名单的通知</td><td width="80" align="center" class="bt_time" style="border-bottom:dashed 1px #ccc">[20 \
    18-01-02]</td></tr>]]></record>"""
    
    soup= BeautifulSoup(a, 'lxml')
    img = soup.img.get('src')
    print(img)
    td = soup.find_all('td')
    for x in td:
        print(x.string)

    结果:

    /picture/0/s1609271437127167930.gif
    None
    [20 18-01-02]
    

    我用beautifulsoup无法得到 2017年度学科带头人考核 合格名单的通知 这个title,原因是使用string的时候,标签内最多有一个子标签才可以,而td下有span和img两个子标签,所以显示none了。固配合了正则表达式来解决,如下:

    from bs4 import BeautifulSoup
    import re
    
    a = """<record><![CDATA[ \
    <tr><td height="26" align="left" style="border-bottom:dashed 1px #ccc"><span style="padding-right:8px;"> \
    <img src="/picture/0/s1609271437127167930.gif" align="absmiddle" border="0"></span>2017年度学科带头人考核 \
    合格名单的通知</td><td width="80" align="center" class="bt_time" style="border-bottom:dashed 1px #ccc">[20 \
    18-01-02]</td></tr>]]></record>"""
    
    soup= BeautifulSoup(a, 'lxml')
    img = soup.img.get('src')
    td = soup.find_all('td')
    pattern = re.compile(r'<td.+?><span.+?>.+?</span>(.+?)</td>')
    title = ''.join(re.findall(pattern, str(td[0]))[0])
    
    print(img)
    print(title)
    print(td[1].string)

    运行结果:

    /picture/0/s1609271437127167930.gif
    2017年度学科带头人考核 合格名单的通知
    [20 18-01-02]
      相似问题
      推荐文章