Использование Python для очистки ReferenceUSA - PullRequest
0 голосов
/ 07 мая 2018

Сначала я очень плохо знаком с Python, так что извините за глупые вопросы.

Я использую Robobrowser и запускаю браузер, используя код ниже. Обратите внимание, что сначала я должен войти на сайт, а затем перейти на страницу результатов поиска (которую я жестко запрограммировал):

from robobrowser import RoboBrowser 
from datetime import datetime
import re 
import csv

browser = RoboBrowser(history = True, parser = 'html.parser', user_agent='chrome')
browser.open('https://cas.columbia.edu/cas/login?service=https%3a%2f%2fwww1.columbia.edu%2fsec-cgi-bin%2fcul%2fprox%2fezpwebserv-ezproxy.cgi%3furl%3dezp.2aHR0cDovL3d3dy5yZWZlcmVuY2V1c2EuY29t')

form = browser.get_form(class_='fm-v clearfix' )
form['username'].value = '**************'
form['password'].value = '**************'
browser.submit_form(form)

url = 'http://www.referenceusa.com.ezproxy.cul.columbia.edu/UsBusiness/Result/41526a3b232941b0ae8df36a9870fec6'
browser.open(url)

То, что я пытаюсь сделать, - это собрать скребок для извлечения данных из ReferenceUSA. У меня открыт веб-сайт, и, глядя на HTML, я вижу элемент, который хочу закодировать как:

<a href="#" class="action-view-record" data-all-url="/UsBusiness/Detail/All/41526a3b232941b0ae8df36a9870fec6/0?recordId=366190858" data-tagged-url="/UsBusiness/Detail/Tagged/41526a3b232941b0ae8df36a9870fec6?recordId=366190858">034 Efi</a>

отсюда я хочу получить текст, поэтому я попытался:

companies = browser.find_all(class_='action-view-record')
for company in companies:
    company_name = company.text
    print(company_name)

Проблема в том, что при запуске кода ничего не печатается. Я думаю, что страница открывается правильно, потому что я попытался:

links = browser.find_all('a')
for link in links:
    print(link.text)

и в нем перечислены все навигационные ссылки вверху / внизу страницы (например, о нас, контактах и ​​т. Д.). Но ни одна из ссылок из фактического результата поиска.

Я также хотел бы получить ссылки из этого тега, чтобы я мог перейти на страницу в деталях. Здесь у меня есть дополнительная проблема, что HREF = '#'. Так как я могу получить ссылку?

спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

Так что я не совсем уверен, как это объяснить, но значение класса является атрибутом тега "a".Есть два основных способа решить эту проблему:

1)

companies = browser.find_all(a)

for company in companies:
    if company.has_attr("class") and company.attrs['class'] == "action-view-record":
        print(company.text)

2)

Другой способ, который немного чище, работает путем фактического указания атрибутов вфункция find_all.Это можно сделать следующим образом:

companies = browser.find_all("a", {"class": "action-view-record"})
for company in companies:
    print(company.text)

И, конечно, поскольку питон - это колени пчел, вы могли бы на самом деле выполнить все это в понимании списка следующим образом:

companies = [company.text for company in browser.find_all("a", {"class": "action-view-record"})]

Надеждаэто помогает.

ОБНОВЛЕНИЕ:

Я никогда раньше не использовал robobrowser, но со страницы github кажется, что вы можете найти:

<div class="teaser-icon">
   <span class="mega-octicon octicon-checklist"></span>
</div>

, используя-

 browser.find('div.teaser-icon')

, так что ... это может сработать для вас,

 browser.find('a.action-view-record')

также убедитесь, что вы находитесь в нужной точке дерева HTML, если элемент находится в стороне отеще как -

<head>
   <body>
     <a class="action-view-record"> TEXT </a>
   </body>
</head>

вам может понадобиться найти ("а") из тела, подобного этому.

head = browser.find('head')
body = head.find("body")
atags = body.find_all("a")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...