2017-01-19 1 views
0

Я пытаюсь ломом детали внутри 25 звеньев этого сайта https://beta.companieshouse.gov.uk/search/companies?q=SW181Db&page=1TypeError: строковые индексы должны быть целыми числами, при попытке напечатать HREF

«/ компания/08569390» является HREF тега в базовый html-код, поэтому по существу я пытаюсь выполнить concatentate base_url ('https://beta.companieshouse.gov.uk/) и текст в href, чтобы я мог пропустить мой цикл через 25 страниц.

Код, который я имею (ниже), дает мне сообщение TypeError: строковые индексы должны быть целыми числами.

Кто-нибудь любезно объяснит мне, где я здесь не так? Мне нужно преобразовать содержимое HREF в целое число, даже думал, что это также содержит некоторый текст, Do (/ компания /)

большое спасибо

import requests 
from bs4 import BeautifulSoup 
import csv 
base_url = 'https://beta.companieshouse.gov.uk/' 

header={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
'Accept-Encoding':'gzip, deflate, sdch, br', 
'Accept-Language':'en-US,en;q=0.8,fr;q=0.6', 
'Connection':'keep-alive', 
'Cookie':'mdtp=y4Ts2Vvql5V9MMZNjqB9T+7S/vkQKPqjHHMIq5jk0J1l5l131dU0YXsq7Rr15GDyghKHrS/qcD2vdsMCVtzKByJEDZFI+roS6tN9FN5IS70q8PkCCBjgFPDZjlR1A3H9FJ/zCWXMNJbaXqF8MgqE+nhR3/lji+eK4mm/GP9b8oxlVdupo9KN9SKanxu/JFEyNXutjyN+BsxRztNem1Z+ExSQCojyxflI/tc70+bXAu3/ppdP7fIXixfEOAWezmOh3ywchn9DV7Af8wH45t8u4+Y=; mdtpdi=mdtpdi#f523cd04-e09e-48bc-9977-73f974d50cea#1484041095424_zXDAuNhEkKdpRUsfXt+/1g==; seen_cookie_message=yes; _ga=GA1.4.666959744.1484041122; _gat=1', 
'Host':'https://beta.companieshouse.gov.uk/', 
#'Referer':'https://beta.companieshouse.gov.uk/', 
'Upgrade-Insecure-Requests':'1', 
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36' 
} 

session = requests.session() 
url = 'https://beta.companieshouse.gov.uk/search/companies?q=SW181Db&page=1' 
response = session.get(url, headers=header) 
soup = BeautifulSoup(response.content,"lxml") 

rslt_table = soup.find("article") 

for elem in rslt_table: 
    det_url = base_url+elem['href'] 
    print det_url 

ответ

1

soup.find("article") не так, как вам найти все эти теги компании, попробуйте использовать вместо find_all:

base_url = 'https://beta.companieshouse.gov.uk' 

companies = soup.find_all('a', {'title': 'View company'}) # to get all company <a> tags 

for company in companies: 
    det_url = base_url+elem['href'] 
    print det_url 
+0

Спасибо Шейн –

+0

Если я хотел, чтобы извлечь информацию я nside ссылки, название компании, адрес и статус компании, это лучше всего сделать в моем существующем цикле for, или я должен создать новый цикл внутри той, в которой я сейчас? Еще раз спасибо –

+0

Уверен, что все это можно сделать в одном цикле, вам просто нужно сначала найти тег 'li', который обертывает всю информацию, а затем найти другой тег для извлечения связанной информации:) – Shane

0

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

links=[] 
headers=soup.findAll("h3") 
for header in headers: 
    det_url = base_url+header.find('a')['href'] 
    links.append(det_url) 
    print det_url 

print links 

Выход я получаю:

['https://beta.companieshouse.gov.uk//company/08569390', 'https://beta.companieshouse.gov.uk//company/09947251', 'https://beta.companieshouse.gov.uk//company/07352770', 'https://beta.companieshouse.gov.uk//company/07908180', 'https://beta.companieshouse.gov.uk//company/04576887', 'https://beta.companieshouse.gov.uk//company/08760943', 'https://beta.companieshouse.gov.uk//company/08265394', 'https://beta.companieshouse.gov.uk//company/03893510', 'https://beta.companieshouse.gov.uk//company/07422059', 'https://beta.companieshouse.gov.uk//company/08819027', 'https://beta.companieshouse.gov.uk//company/08325123', 'https://beta.companieshouse.gov.uk//company/09669365', 'https://beta.companieshouse.gov.uk//company/08641990', 'https://beta.companieshouse.gov.uk//company/06318392', 'https://beta.companieshouse.gov.uk//company/09400775', 'https://beta.companieshouse.gov.uk//company/01930797', 'https://beta.companieshouse.gov.uk//company/09398542', 'https://beta.companieshouse.gov.uk//company/07784981', 'https://beta.companieshouse.gov.uk//company/07480763', 'https://beta.companieshouse.gov.uk//company/06971238'] 
0

Эта линия:

rslt_table = soup.find("article") 

возвращает вас один article элемент. Когда вы сделаете это:

for elem in rslt_table: 

вы цикл по каждому элементу article как в виде обычного текста. Таким образом, elem является строкой и не может быть проиндексирован другой строкой, как вы пытаетесь сделать с elem["href"]. То, что вы хотите сделать, это получить a элементов, а не струны, в rslt_table:

for elem in rslt_table.find_all("a"): 

Изменение этой линии даст вам то, что вы хотите.

0

Если вы ищете для компаний, в частности, почтовые индексы, вы можете предпочесть, чтобы загрузить этот набор данных, а не выскабливание: http://download.companieshouse.gov.uk/en_output.html

Companies House также предлагает API, который вы могли бы оказаться полезным: https://developer.companieshouse.gov.uk/api/docs/

Смежные вопросы