我无法使用BeautifulSoup从表中提取数据

时间:2019-01-12 15:40:10

标签: python web-scraping beautifulsoup formatting

我正在尝试使用beautifulsoup刮擦两张桌子,然后撞到砖墙上。网站:https://bgp.he.net/country/US我正试图从表中获取标题行,但由于某种原因无法将其解析为列表,因此我可以对其进行操作。然后,我想从每一列中获取数据并将其全部输出到JSON文件。

示例:

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

   #Append to list(?)

要删除不需要的条目吗?

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

ASN#:国家/地区:“美国”,“名称”:XXX,“ Routes V4”,“ XXXX”,“ Routes V6”,“ XXX”

2 个答案:

答案 0 :(得分:1)

如果您获得的响应代码不是标头中设置了200的User-Agent,则获取403 Forbidden

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

答案 1 :(得分:1)

与下面的BeautifulSoup版本略有不同的方法,为您提供选择。

我喜欢BeautifulSoup进行解析,直到看到<table>标签。然后我通常只去Pandas来获取表,因为它可以在1行中完成,然后可以根据需要操纵数据框。

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

import pandas as pd
import requests
import json

url = 'https://bgp.he.net/country/US'

session = requests.Session()
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
        "Accept-Encoding": "gzip, deflate",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Language": "en"}


response = session.get(url, headers=headers)

tables = pd.read_html(response.text)
table = tables[0]
table['Country'] = url.split('/')[-1]




jsonObject = table.to_dict(orient='records')


# if you need as string to write to json file
jsonObject_string = json.dumps(jsonObject)

输出:

[{'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'}...