zll962464 2023-03-28 10:02 采纳率: 50%
浏览 73
已结题

python爬取网页信息(主要为期刊影响因子、官网等),已有ISSN进行检索,但爬取过程找不到class该怎么办?

如第一张图所示,已经拥有ISSN,通过搜索框输入后,对结果栏(如第二张图所示)里面的一些指标包括影响因子、官网等进行提取,在通过request提取后,发现找不到这些指标对应的class,代码如第三张图所示,最终想得到的信息如第四张图所示。初学python,问题比较愚蠢还请见谅。

img


img


img


img

  • 写回答

5条回答 默认 最新

  • 阳光宅男xxb 2023-03-28 14:12
    关注

    你需要现在网页html中看下那些指标因子的html结构是什么,才知道怎么提取。你的数据是在一个表格中,你可以先定位到表格的html,然后通过前后html标签来定位到你要解析的数据。代码如下,已成功提取,望采纳!

    import requests
    from bs4 import BeautifulSoup
    import re
    
    req = requests.get(url="https://www.letpub.com.cn/index.php?journalid=662&page=journalapp&view=detail")
    req.encoding = "utf-8"
    html=req.text
    
    soup = BeautifulSoup(html,'lxml')
    #先定位数据所在的table
    table_htmls = soup.find_all('table',attrs={'class':'table_yjfx'})
    
    tr = table_htmls[1].find('td',string=re.compile("E-ISSN"))
    print(tr.parent.next_sibling.contents[1].get_text())
    
    td_2 = table_htmls[1].find('td',string="期刊官方网站")
    if td_2:
        print(td_2.next_sibling.a['href'])
    
    

    最后成功提取你要的数据:

    img


    因为我这里没有登录,所以影响因子那里是图上的文字

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • 小逸2023 2023-03-28 10:05
    关注
    该回答引用ChatGPT
    在爬取网页信息时,如果找不到对应的class,可以尝试以下几种方法:
    1. 使用其他属性进行定位:除了class,还有id、name、tag等属性可以用来定位元素。可以通过浏览器的开发者工具查看元素的属性,找到一个唯一的属性进行定位。
    2. 使用正则表达式:如果无法通过属性定位元素,可以尝试使用正则表达式来匹配需要的信息。可以使用re模块进行正则表达式的匹配。
    3. 使用第三方库:如果以上方法都无法解决问题,可以尝试使用第三方库,如BeautifulSoup、pyquery等,这些库可以更方便地提取网页信息。
    以下是使用BeautifulSoup库进行信息提取的示例代码:
    python
    import requests
    from bs4 import BeautifulSoup
    url = 'http://www.letpub.com.cn/index.php?page=journalapp&view=search'
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    params = {
    'searchname': 'ISSN',
    'searchtype': 'exact',
    'searchword': '0001-6233'
    }
    response = requests.post(url, headers=headers, data=params)
    soup = BeautifulSoup(response.text, 'html.parser')
    impact_factor = soup.find('td', text='影响因子').find_next_sibling('td').text.strip()
    official_website = soup.find('td', text='官方网站').find_next_sibling('td').text.strip()
    print('影响因子:', impact_factor)
    print('官方网站:', official_website)

    在这个示例中,我们使用了post方法向网站发送请求,并使用BeautifulSoup库解析返回的HTML文档。通过find方法找到对应的元素,再使用find_next_sibling方法找到下一个兄弟元素,最后使用text属性获取元素的文本内容。
    评论
  • 「已注销」 2023-03-28 10:17
    关注

    不一定要找class标签,可以找其他标签作为抓取的定位,再根据正则去匹配试试。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-28 12:56
    关注
    评论
  • 蓝白、波罗歌 2023-03-28 13:13
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    根据你提供的信息,我们可以使用Python的requests库和BeautifulSoup库来爬取网页信息并提取需要的内容。

    首先,我们需要通过requests库来请求网页信息。这里提供一个示例代码:

    import requests
    
    url = 'http://mjl.clarivate.com/cgi-bin/jrnlst/jlresults.cgi?PC=MASTER&ISSN=' + ISSN
    response = requests.get(url)
    

    其中,ISSN是你想要查询的期刊的ISSN号码。这里将ISSN添加到了url中,并使用requests.get()方法来请求网页信息。请求成功后,我们可以对response进行解析。

    接下来,我们可以使用BeautifulSoup库来解析网页信息,并查找我们需要的指标。这里提供一个示例代码:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 获取官网信息
    website = soup.find(string='Publisher')
    if website:
        website = website.parent.nextSibling.contents[0]
    else:
        website = ''
    
    # 获取影响因子信息
    impact_factor = soup.find(string='Impact Factor')
    if impact_factor:
        impact_factor = impact_factor.parent.nextSibling.contents[0]
    else:
        impact_factor = ''
    

    这里使用BeautifulSoup库,将response.text作为输入,将网页信息解析为BeautifulSoup对象soup。然后使用soup.find()方法查找我们需要的指标,并提取其内容。在你的代码中可能会找不到class,但是使用soup.find()方法可以寻找其他标签属性,也可以使用正则表达式寻找内容。

    最终,我们可以将需要的信息保存在一个字典中,代码如下:

    journal_info = {
        'ISSN': ISSN,
        'website': website,
        'impact_factor': impact_factor
    }
    

    将其返回即可。完整代码如下:

    ```python
    import requests
    from bs4 import BeautifulSoup

    def get_journal_info(ISSN):
    url = 'http://mjl.clarivate.com/cgi-bin/jrnlst/jlresults.cgi?PC=MASTER&ISSN=%27 + ISSN
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # 获取官网信息
    website = soup.find(string='Publisher')
    if website:
        website = website.parent.nextSibling.contents[0]
    else:
        website = ''
    
    # 获取影响因子信息
    impact_factor = soup.find(string='Impact Factor')
    if impact_factor:
        impact_factor = impact_factor.parent.nextSibling.contents[0]
    else:
        impact_factor = ''
    
    # 返回结果字典
    journal_info = {
        'ISSN': ISSN,
        'website': website,
        'impact_factor': impact_factor
    }
    return journal_info
    

    ``

    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 已采纳回答 3月28日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 如何利用闲置机械硬盘变现
  • ¥15 信号处理中的凸优化问题
  • ¥15 arm虚拟机无法和物理机互通
  • ¥15 Android导航条遮盖异常
  • ¥15 计算机网络技术基础问题
  • ¥15 设置mac系统只能访问指定网站
  • ¥15 西门子博途 s7 1200控制三台步进电机
  • ¥15 基于非参数的方向距离函数求污染物影子价格(有偿)
  • ¥15 vue+element 生成table
  • ¥15 实验 4 FIFO 算法和 LRU 算法-C 程序实现