python - 网页抓取:索引超出范围(可能的缩放错误)
问题描述
嗨写了一个网页抓取程序,它正确获取了ASN号,但是在抓取了所有数据之后,它返回一个错误“Array Out if Bounds”。
我正在使用 Pycharm 和最新的 python 版本。下面是我的代码。stackoverflow 上已经存在类似的问题,但我无法将这些部分组合在一起并使其工作。(Web Scraping List Index Out Of Range)它完全相同的错误,但我不知道如何让它为我的列表工作。
错误似乎在 current_country = link.split('/')[2] 任何帮助表示赞赏。谢谢你。
import urllib.request
import bs4
import re
import json
url = 'https://ipinfo.io/countries'
SITE = 'https://ipinfo.io'
def url_to_soup(url):
req = urllib.request.Request(url)
opener = urllib.request.build_opener()
html = opener.open(req)
soup = bs4.BeautifulSoup(html, "html.parser")
return soup
def find_pages(page):
pages = []
for link in page.find_all(href=re.compile('/countries')):
pages.append(link.get('href'))
return pages
def scrape_pages(links):
mappings = {}
print("Scraping Pages for ASN Data...")
for link in links:
country_page = url_to_soup(SITE + link)
current_country = link.split('/')[2]
print(current_country)
for row in country_page.find_all('tr'):
columns = row.find_all('td')
if len(columns) > 0:
current_asn = re.findall(r'\d+', columns[0].string)[0]
print(current_asn)
"""
name = columns[1].string
routes_v4 = columns[3].string
routes_v6 = columns[5].string
mappings[current_asn] = {'Country': current_country,
'Name': name,
'Routes v4': routes_v4,
'Routes v6': routes_v6}
return mappings """
main_page = url_to_soup(url)
country_links = find_pages(main_page)
#print(country_links)
asn_mappings = scrape_pages(country_links)
print(asn_mappings)
解决方案
https://ipinfo.io/countries中最后一个href
包含字符串“ /countries
”实际上是“ ”:/countries
<li><a href="/countries">Global ASNs</a></li>
拆分此链接后,它会生成["", "countries"]
缺少第三个元素的列表。要解决此问题,只需在检索第三个元素之前检查列表长度:
...
current_country = link.split('/')
if len(current_country) < 3:
continue
current_country = current_country[2]
...
href
另一种解决方案是通过将正则表达式更改为排除最后一个:
...
for link in page.find_all(href=re.compile('/countries/')):
...
推荐阅读
- c# - 使背景图像动态并每隔几秒钟更改一次
- python - 尝试访问字典内列表中的变量
- javascript - 何时调用带和不带括号 () 的函数?
- javascript - 如何改进 JS 游戏循环?
- python-3.x - 在 MacOS 中构建 python 3 c 模块 - 使用奇怪的编译器选项进行设置
- flutter - Flutter - TextField 不会自动聚焦到下一个 TextField
- swagger-ui - OpenApi 无法解析引用
- .net - MonoDevelop“无法还原包”,Microsoft.NET.TargetFrameworkInference.targets 中的 MSBuild 语法错误
- tensorflow - ValueError:不是 TBLoader 或 TBPlugin 子类:
- python - 创建简单的like按钮