Python I';我使用BeautifulSoup从表中提取数据时遇到问题

Python I';我使用BeautifulSoup从表中提取数据时遇到问题,python,web-scraping,beautifulsoup,formatting,Python,Web Scraping,Beautifulsoup,Formatting,我想用beautifulsoup刮两张桌子,结果撞到了砖墙上。网站:我试图从表中获取标题行,但由于某些原因,无法将其解析为列表,以便我可以对其进行操作。然后,我想从每个列中获取数据,并将其全部输出到一个JSON文件中 例如: for row in soup.find_all("tr"): #Append to list(?) 删除不需要的条目 我希望能够将其输出到JSON文件,并像这样显示它 ASN#:国家:“美国”,“名称”:XXX,“路线V4”,“XXXX”,“路线V6”,“XXX

我想用beautifulsoup刮两张桌子,结果撞到了砖墙上。网站:我试图从表中获取标题行,但由于某些原因,无法将其解析为列表,以便我可以对其进行操作。然后,我想从每个列中获取数据,并将其全部输出到一个JSON文件中

例如:

for row in soup.find_all("tr"):

   #Append to list(?)
删除不需要的条目

我希望能够将其输出到JSON文件,并像这样显示它


ASN#:国家:“美国”,“名称”:XXX,“路线V4”,“XXXX”,“路线V6”,“XXX”

如果您收到的响应代码不是
200
在标题中设置用户代理,则我的将被禁止
403

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get('https://bgp.........', headers=headers)

soup = BeautifulSoup(html.text, 'html.parser')
#print(soup)
data = []
for row in soup.find_all("tr")[1:]: # start from second row
    cells = row.find_all('td')
    data.append({
        'ASN': cells[0].text,
        'Country': 'US',
        "Name": cells[1].text,
        "Routes V4": cells[3].text,
        "Routes V6": cells[5].text
    })

print(data)
结果:

[
  {'ASN': 'AS6939', 'Country': 'US', 'Name': 'Hurricane Electric LLC', 'Routes V4': '127,337', 'Routes V6': '28,227'},
  {'ASN': 'AS174', 'Country': 'US', 'Name': 'Cogent Communications', 'Routes V4': '118,159', 'Routes V6': '8,814'}
]
获取国家和代码

country = soup.select_one('h2 img').get('title')
# United State
country_code = 'https://bgp.he.net/country/US'.split('/')[-1]
# US

如果您得到的响应代码不是
200
在标题中设置用户代理,则我的响应代码是
403禁止

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get('https://bgp.........', headers=headers)

soup = BeautifulSoup(html.text, 'html.parser')
#print(soup)
data = []
for row in soup.find_all("tr")[1:]: # start from second row
    cells = row.find_all('td')
    data.append({
        'ASN': cells[0].text,
        'Country': 'US',
        "Name": cells[1].text,
        "Routes V4": cells[3].text,
        "Routes V6": cells[5].text
    })

print(data)
结果:

[
  {'ASN': 'AS6939', 'Country': 'US', 'Name': 'Hurricane Electric LLC', 'Routes V4': '127,337', 'Routes V6': '28,227'},
  {'ASN': 'AS174', 'Country': 'US', 'Name': 'Cogent Communications', 'Routes V4': '118,159', 'Routes V6': '8,814'}
]
获取国家和代码

country = soup.select_one('h2 img').get('title')
# United State
country_code = 'https://bgp.he.net/country/US'.split('/')[-1]
# US

与下面的BeautifulSoup版本稍有不同的方法为您提供选项

我喜欢对BeautifulSoup进行解析,直到我看到
标记。然后我通常只去Pandas获取表,因为它可以在一行中完成,然后我可以根据需要操作数据帧

然后就可以将数据帧转换为json(实际上是几周前从EwLink解决方案中学到的:-)

输出:

[{'ASN': 'AS6939', 'Name': 'Hurricane Electric LLC', 'Adjacencies v4': 7216, 'Routes v4': 127337, 'Adjacencies v6': 4460, 'Routes v6': 28227, 'Country': 'US'}, {'ASN': 'AS174', 'Name': 'Cogent Communications', 'Adjacencies v4': 5692, 'Routes v4': 118159, 'Adjacencies v6': 1914, 'Routes v6': 8814, 'Country': 'US'}...

与下面的BeautifulSoup版本稍有不同的方法为您提供选项

我喜欢对BeautifulSoup进行解析,直到我看到
标记。然后我通常只去Pandas获取表,因为它可以在一行中完成,然后我可以根据需要操作数据帧

然后就可以将数据帧转换为json(实际上是几周前从EwLink解决方案中学到的:-)

输出:

[{'ASN': 'AS6939', 'Name': 'Hurricane Electric LLC', 'Adjacencies v4': 7216, 'Routes v4': 127337, 'Adjacencies v6': 4460, 'Routes v6': 28227, 'Country': 'US'}, {'ASN': 'AS174', 'Name': 'Cogent Communications', 'Adjacencies v4': 5692, 'Routes v4': 118159, 'Adjacencies v6': 1914, 'Routes v6': 8814, 'Country': 'US'}...

您是否收到
?似乎对我来说,我得到了
不,我能够成功地打印HTML代码。我可以轻松地获取代码并使用打印(soup.prettify())。啊,好的。你能把那个代码加到你上面的问题上吗?没关系。我发现了我的错误。url中有一个输入错误。我马上会有一个解决方案,你明白了吗?似乎对我来说,我得到了
不,我能够成功地打印HTML代码。我可以轻松地获取代码并使用打印(soup.prettify())。啊,好的。你能把那个代码加到你上面的问题上吗?没关系。我发现了我的错误。url中有一个输入错误。我将在momentSo hard中找到一个解决方案,删除“ASN”和“country”条目,而不是尝试转到标题行:正文文本,标题行:正文文本。非常感谢。我将尝试一下。因为它们是固定字符串,我将直接编写它以加快代码速度,但您当然可以改进它。我想知道是否可以对当前HTML链接应用解析器并打印链接的最后两个字符,而不是对我们进行硬编码。因此,可以在许多页面上使用它。是的,当然可以在循环中这样做,只需动态地使用后缀并迭代不同的值(例如,对于西班牙)。@JordanNewman我编辑了答案,以获得countrySo硬编码的“ASN”和“country”条目,而不是试图转到标题行:正文,标题行:正文文本。非常感谢。我将尝试一下。因为它们是固定字符串,我将直接编写它以加快代码速度,但您当然可以改进它。我想知道是否可以对当前HTML链接应用解析器并打印链接的最后两个字符,而不是对我们进行硬编码。因此,可以在很多页面上使用它。是的,当然可以在循环中这样做,只需使用后缀dynamic并迭代不同的值(例如西班牙)。@JordanNewman我编辑了答案以获得国家