lxml вернул мне список, но он пуст

Я пытался составить список всех аккаунтов 1000 лучших инстаграмеров с этого сайта: 'https://hypeauditor.com/top-instagram/'. Список, возвращаемый из lxml, пуст как для lxml.html, так и для lxml.etree.

Я пытался удалить tbody, удалить text() и верхний xpath, но все это не удалось. что стоит отметить, так это то, что с верхним xpath он мне что-то вернул, но это все, кроме /n.

Сначала я попробовал lxml.etree

market_url='https://hypeauditor.com/top-instagram/'
r_market=requests.get(market_url)
s_market=etree.HTML(r_market)`
file_market=s_market.xpath('//*[@id="bloggers-top-table"]/tr[1]/td[3]/a/text()')

затем я также попробовал lxml.html.

tree=html.fromstring(r_market.content)
result=tree.xpath('//*[@id="bloggers-top-table"]/tr/td/h4/text()')

кроме того, я попробовал этот xpath:

s_market.xpath('//*[@id="bloggers-top-table"]/tbody/text()')

Это не дало мне никакой ошибки. Но после всех попыток он все равно выдает мне пустой список или список, полный n/.

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


person Onlyfood    schedule 30.05.2019    source источник
comment
вы искали всю таблицу или только определенные столбцы?   -  person QHarr    schedule 30.05.2019
comment
Я только за колонку для аккаунта инстаграмера.   -  person Onlyfood    schedule 30.05.2019


Ответы (3)


Вам обязательно захочется ознакомиться с пакетом BeautifulSoup, позволяющим ориентироваться содержимое веб-страницы в python.

Использование BeautifulSoup:

import requests
from bs4 import BeautifulSoup

url = 'https://hypeauditor.com/top-instagram/'
r = requests.get(url)
html = r.text

soup = BeautifulSoup(html, 'html.parser')

top_bloggers = soup.find('table', id="bloggers-top-table")
table_body = top_bloggers.find('tbody')
rows = table_body.find_all('tr')

# For all data:
# Will retrieve a list of lists, good for inputting to pandas

data=[]

for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele]) # Get rid of empty values


# For just handles:
# Will retrieve a list of handles, only

handles=[]

for row in rows:
    cols = row.find_all('td')
    values = cols[3].text.strip().split('\n')
    handles.append(values[-1])

Цикл for, который я использую для строк, взят из этого ответа

person Yaakov Bressler    schedule 30.05.2019
comment
Спасибо за ваш подробный и страстный ответ, мой вопрос решен. Обязательно присмотрюсь к Beautiful Soup. - person Onlyfood; 30.05.2019
comment
Еще один вопрос, надеюсь, это не слишком много. Как удалить все страницы таблицы вместо первой? - person Onlyfood; 30.05.2019
comment
Вы спрашиваете о дополнительных таблицах на этой конкретной веб-странице? Или дополнительные веб-страницы? - person Yaakov Bressler; 31.05.2019
comment
Например, получение таблиц на сайте hypeauditor.com/top-instagram/p=2. и так до 20. - person Onlyfood; 31.05.2019
comment
Вы можете создать цикл for или цикл while для циклического перебора каждого идентификатора в URL-адресе. Например: urls = ['https://hypeauditor.com/top-instagram/p2=p{i}') for i in range(1,100)] - person Yaakov Bressler; 02.06.2019

Вот более легкий способ получить именно этот столбец, используя nth-of-type. Вы должны найти это быстрее.

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://hypeauditor.com/top-instagram/')
soup = bs(r.content, 'lxml')
accounts = [item.text.strip().split('\n') for item in soup.select('#bloggers-top-table td:nth-of-type(4)')][1:]
print(accounts)
person QHarr    schedule 31.05.2019

Более простой способ сделать это — использовать pandas. Он может без проблем читать простые HTML-таблицы. Попробуйте использовать следующий код, чтобы очистить всю таблицу.

import pandas as pd

df = pd.read_html('https://hypeauditor.com/top-instagram/')
person Thomas Hayes    schedule 30.05.2019