lxml向我返回了一个列表,但它为空

时间:2019-05-30 03:02:54

标签: python html web-scraping lxml xml.etree

我试图从此网站列出所有前1000名instagramer帐户的列表:“ 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 /的列表。

我没有真正的Web爬网经验,因此我可能在某个地方犯了一个愚蠢的错误,但是由于没有数据,我无法启动我的机器学习模型,所以我真的很努力,请帮忙。

3 个答案:

答案 0 :(得分:2)

更简单的方法是使用pandas。它可以像这样毫无问题地读取简单的HTML表。尝试使用以下代码来擦除整个表。

import pandas as pd

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

答案 1 :(得分:2)

您肯定会熟悉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循环源自此answer

答案 2 :(得分:2)

这是使用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)