lxml вернул мне список, но он пуст - PullRequest
1 голос
/ 30 мая 2019

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

Я пытался удалить tbody, удалить текст () и верхний 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 /.

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

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Вам наверняка захочется ознакомиться с пакетом 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, который я использую для строк, получен из этого ответа

2 голосов
/ 31 мая 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)
2 голосов
/ 30 мая 2019

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

import pandas as pd

df = pd.read_html('https://hypeauditor.com/top-instagram/')
...