使用beautifulsoup检查图书馆图书的可用性

2024-10-02 10:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在学Python。我正试图用它来自动检查图书馆图书的可用性。你知道吗

我试着用bs4、请求和分区来执行它。你知道吗

这是我试图解析的链接:[http://catalogue.nlb.gov.sg/cgi-bin/spydus.exe/FULL/EXPNOS/BIBENQ/1592917/156302298,2][1]

我查看了它的源代码,下面是它的一个片段:

<tr>
  <td valign="top"><a href="/cgi-bin/spydus.exe/ENQ/EXPNOS/GENENQ/1564461?LOCX=BIPL">**Bishan Public Library**</a>
    <br />
  </td>
  <td valign="top">
    <book-location data-title="The opposite of everyone" data-branch="BIPL" data-usagelevel="001" data-coursecode="" data-language="English" data-materialtype="BOOK" data-callnumber="JAC" data-itemcategory="" data-itemstatus="" data-lastreturndate="20160322"
    data-accession="B31189097E" data-defaultLoc="Adult Lending">Adult Lending</book-location>
  </td>
  <td valign="top"><a href="/cgi-bin/spydus.exe/ENQ/EXPNOS/BIBENQ/1564461?CGS=E*English">English</a>
    <br /><a href="/cgi-bin/spydus.exe/WBT/EXPNOS/BIBENQ/1564461?CNO=JAC&amp;CNO_TYPE=B">JAC</a>
    <br />
  </td>
  <td valign="top">**Available**
    <br />
  </td>
</tr>
<tr>
  <td valign="top"><a href="/cgi-bin/spydus.exe/ENQ/EXPNOS/GENENQ/1564461?LOCX=BMPL">**Bukit Merah Public Library**</a>
    <br />
  </td>
  <td valign="top">
    <book-location data-title="The opposite of everyone" data-branch="BMPL" data-usagelevel="001" data-coursecode="" data-language="English" data-materialtype="BOOK" data-callnumber="JAC" data-itemcategory="" data-itemstatus="" data-lastreturndate="20160405"
    data-accession="B31189102C" data-defaultLoc="Adult Lending">Adult Lending</book-location>
  </td>
  <td valign="top"><a href="/cgi-bin/spydus.exe/ENQ/EXPNOS/BIBENQ/1564461?CGS=E*English">English</a>
    <br /><a href="/cgi-bin/spydus.exe/WBT/EXPNOS/BIBENQ/1564461?CNO=JAC&amp;CNO_TYPE=B">JAC</a>
    <br />
  </td>
  <td valign="top">**Available**
    <br />
  </td>
</tr>

我试图分析的信息是这本书在哪个图书馆可以买到。你知道吗

以下是我所做的:

import requests, bs4
>>> res = requests.get('http://catalogue.nlb.gov.sg/cgi-bin/spydus.exe/FULL/EXPNOS/BIBENQ/1592917/156302298,2')
>>> string = bs4.BeautifulSoup(res.text)

然后我试着把字符串变成一个字符串:

>>> str(string)

而且它把所有的源代码都打印出来,严重滞后了我的空闲时间!你知道吗

在它停止滞后后,我做了这样一件事:

>>> keyword = '<a href="/cgi-bin/spydus.exe/ENQ/EXPNOS/GENENQ/1564461?LOCX='
>>> string.partition('keyword') Traceback (most recent call last):   File "<pyshell#8>", line 1, in <module>
    string.partition('keyword') TypeError: 'NoneType' object is not callable

我不知道为什么会出错,我确实把字符串变成了一个字符串,对吧?你知道吗

另外,我使用这个关键字是因为它就在“library branch”之前和“availability”之后。所以我想,即使它产生了大量其他冗余代码,我也能在第一行看到这本书在哪个图书馆分馆有售。你知道吗

我相信我做这件事的方式不是最有效的方式,如果你能给我指出正确的方式,或者给我看,我将不胜感激!你知道吗

很抱歉,这是一个很长的帖子,但我正在尽可能详细地介绍我的情况。谢谢你和我在一起。你知道吗


Tags: brdatabinenglishtopexetdhref
1条回答
网友
1楼 · 发布于 2024-10-02 10:33:11

不,您没有将string生成Python字符串,因为您没有将str(string)的结果赋给任何变量,因此它将丢失:

>>> type(string)
<class 'bs4.BeautifulSoup'>
>>> type(str(string))
<type 'str'>
>>> type(string)
<class 'bs4.BeautifulSoup'>

变量string不变。试试这个:

>>> string = str(string)
>>> type(string)
<type 'str'>

现在您有了一个str字符串。你知道吗

另一方面,为什么不使用BeautifulSoup从HTML中提取数据呢?这就是它的目的,也是它擅长的。这里有一种方法:

import requests
from bs4 import BeautifulSoup

html = requests.get('http://catalogue.nlb.gov.sg/cgi-bin/spydus.exe/FULL/EXPNOS/BIBENQ/1592917/156302298,2').text
soup = BeautifulSoup(html)

holdings = soup.find('table', class_='clsTab1').find_all('tr')
for holding in holdings:
    cells = holding.find_all('td')
    if cells:
        library = cells[0].text
        availability = cells[-1].text
        print('{}: {}'.format(library, availability))

输出

Ang Mo Kio Public Library: Available
Bedok Public Library: Available
Bishan Public Library: Available
Bukit Merah Public Library: Available
Central Public Library: Available
Geylang East Public Library: Available
Jurong Regional Library: Available
Jurong West Public Library: Available
library@orchard: Available
Marine Parade Public Library: Onloan - Due: 13 May 2016
Queenstown Public Library: Onloan - Due: 29 May 2016
Tampines Regional Library: Available
Toa Payoh Public Library: Available
Woodlands Regional Library: Available

相关问题 更多 >

    热门问题