爬取文章摘要时时用find()定位专辑后面的内容

<ul>
                  <li class="top-space"><span class="rowtit">专辑:</span><p>信息科技</p>
                  </li>
                  <li class="top-space"><span class="rowtit">专题:</span><p>人口学与计划生育; 贸易经济</p>
                  </li>
                  <li class="top-space"><span class="rowtit">分类号:</span><p>C924.2;F752</p>
                  </li>
                </ul>


上边的图是代码
(1)想定位这个专辑后面的“信息科技“这段文字信息如何抓取啊,不同网页他的专题和分类号的位置可能在专辑的前面也可能在后面,
(2)定位标题时用的代码:


title=soup.find('div',class_= 'wx-tit').find('h1').text.strip()

用这种格式应该怎么写

你是指定位所有和专辑一并出现的主题吧

import bs4
x = """<?xml version="1.0" encoding="UTF-8"?>
<ul>
    <li class="top-space">
        <span class="rowtit">专辑:</span>
        <p>信息科技</p>
    </li>
    <li class="top-space">
        <span class="rowtit">专题:</span>
        <p>人口学与计划生育; 贸易经济</p>
    </li>
    <li class="top-space">
        <span class="rowtit">分类号:</span>
        <p>C924.2;F752</p>
    </li>
</ul>
"""

soup = bs4.BeautifulStoneSoup(x)
res = soup.find_all('p')[0]
print(res)

正则:

x = """<?xml version="1.0" encoding="UTF-8"?>
<ul>
    <li class="top-space">
        <span class="rowtit">专辑:</span>
        <p>信息科技</p>
    </li>
    <li class="top-space">
        <span class="rowtit">专题:</span>
        <p>人口学与计划生育; 贸易经济</p>
    </li>
    <li class="top-space">
        <span class="rowtit">分类号:</span>
        <p>C924.2;F752</p>
    </li>
</ul>
"""

import re

res = re.findall(r"专辑:</span>.*?<p>(.*?)</p>",x, re.DOTALL)
print(res)

需求
想爬到信息科技这个内容,其他页面的格式会有变化,有的分类号在前面,他们属性一样,我不知道怎么定位了,就是知网点开文章的那个页面爬取

 <li class="top-space"><span class="rowtit">专辑:</span><p>信息科技</p>
                  </li>
                  <li class="top-space"><span class="rowtit">专题:</span><p>人口学与计划生育; 贸易经济</p>
                  </li>
                  <li class="top-space"><span class="rowtit">分类号:</span><p>C924.2;F752</p>

解决办法
也就是专辑、专题、分类号这三个顺序可能是乱序无规则的导致你无法定位。
那么为什么不尝试把这三个都定位一下,
1、获取三个元素,每个都获取span里面的内容和p的内容,放在一个list或者dict里面
2、然后加个判断,如果span的内容中包含'专辑'两使用这个个词,那么就知道这个对应的p里面的内容是你想要的。

给个思路吧,可以先定位

  • ,获取到一个列表,遍历列表查看里边的,如果是专辑的的话,找这个li里边的p的信息

如果单纯拿这个的话,其实正则表达式很合适
<li class="top-space"><span class="rowtit">专辑:</span><p>(.*?)</p>

import re

mData = '''
    <ul>
        <li class="top-space"><span class="rowtit">专辑:</span><p>信息科技</p>
        </li>
        <li class="top-space"><span class="rowtit">专题:</span><p>人口学与计划生育; 贸易经济</p>
        </li>
        <li class="top-space"><span class="rowtit">分类号:</span><p>C924.2;F752</p>
        </li>
    </ul>
'''

print(re.findall('<li class="top-space"><span class="rowtit">专辑:</span><p>(.*?)</p>', mData))

img

使用正则表达式