2016-05-04 6 views
0

Я изучаю python. И я пытаюсь использовать его для автоматизации процесса проверки доступности библиотечной книги.Проверка наличия библиотеки с помощью beautifulsoup

Я попытался выполнить его с помощью 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) 

И напечатанное исходный код весь, и сильно отставал мой IDLE!

После того, как перестал отставать, я сделал это:

>>> 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 

Я не знаю, почему это вызвало ошибку, я сделать строку в строку, не так ли?

Кроме того, я использовал это ключевое слово, потому что оно находится прямо перед «ветвью библиотеки» и сразу после «доступности». Поэтому я подумал, что даже если он выдаст много другого избыточного кода, я смогу увидеть в первой строке, в какой библиотеке находится книга.

Я уверен, что я сделал это не самым эффективным способом, и если бы вы могли указать мне на правильный путь или показать его мне, я буду чрезвычайно благодарен!

Прошу прощения, это очень длинный пост, но я стараюсь как можно подробнее рассказать о своей ситуации. Спасибо, что согласились со мной.

ответ

1

Нет, ты не сделал 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 
[email protected]: 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 
Смежные вопросы