使用BS,在某些python3迭代中缺少行时循环标记

使用BS,在某些python3迭代中缺少行时循环标记,python,beautifulsoup,Python,Beautifulsoup,我正在尝试使用BS来选择span name*=nv标记的项目。但是,最多有2条“span”行(我想要第二条),当第二条行丢失时,我的循环将返回一个索引错误,而不是仅仅通过丢失的行 当我的索引存在时,我如何告诉我的循环跳过丢失的行并返回 下面的方法很有效。但是,如果我将索引从0更改为1(这是我所需要的),我会得到一个索引错误。我知道我为什么会收到错误,但我不知道如何解决它 sauce = urllib.request.urlopen('https://www.imdb.com/list/ls0

我正在尝试使用BS来选择span name*=nv标记的项目。但是,最多有2条“span”行(我想要第二条),当第二条行丢失时,我的循环将返回一个索引错误,而不是仅仅通过丢失的行

当我的索引存在时,我如何告诉我的循环跳过丢失的行并返回


下面的方法很有效。但是,如果我将索引从0更改为1(这是我所需要的),我会得到一个索引错误。我知道我为什么会收到错误,但我不知道如何解决它

sauce = urllib.request.urlopen('https://www.imdb.com/list/ls047677021/').read()
soup = bs.BeautifulSoup(sauce, 'lxml')


gross=[]

for div in soup.find_all('div', class_='lister-item mode-detail'):
    money = div.select('span[name*=nv]')[0]['data-value']
    gross.append(money)

gross

错误


索引器错误回溯(最近一次调用)
在里面
2.
3表示汤中的div。查找所有('div',class='lister-item mode detail'):
---->4 money=div.select('span[name*=nv]')[1]['data-value']
5.追加(款项)
6.
索引器:列表索引超出范围


我应该在字典里找到一个值列表。相反,我会得到一个错误(或者如果我更改了索引)或者错误的数据。

编辑:这是使用Beauty Soup 4.7+

就我个人而言,我会把你的选择范围缩小一点。实际上,您可以使用更好的选择器将目标锁定在所需的目标上。然后您可以使用
选择一个
,它将返回您想要的元素。然后,您可以通过查看它是否为
None
(表示您没有它)来检查您是否得到了它

你可以通过两种方式得到这个。首先,我将向您展示如何在CSS级别4中使用一个新功能:
:第n个子项(s的an+b)
。这将选择与选择器匹配的第二个量程

CSS规范:

或者,您可以使用自定义的
:contains
伪类,以
总值:
作为span后面的span的目标

输出:

['678,815,482', '700,059,566', '324,591,735', '417,719,760', '145,443,742', '213,515,506', '220,159,104', '137,690,172', '608,581,744', '216,210,777', '216,648,740', '213,767,512', '188,024,361', '51,024,708', '159,555,901', '215,288,866', '117,443,149', '159,342,015', '139,377,762', '120,634,935', '32,732,301', '57,421,715', '46,874,505', '174,532,921', '44,069,456', '335,061,807', '53,542,417', '99,345,950', '59,185,715', '102,084,362', '50,072,235', '69,001,013', '18,095,701', '100,407,760', '44,936,545', '48,686,605', '67,796,355', '54,547,470', '30,014,539', '69,086,325', '17,839,115', '81,903,458', '100,478,608', '99,215,042', '59,839,515', '2,474,044', '167,510,016', '21,704,844', '44,947,622', '115,715,889', '36,108,758', '28,780,744', '11,871,365', '48,795,601', '45,495,662', '1,214,525', '40,826,341', '40,717,020', '32,015,231', '21,023,275', '270,620,950', '33,562,069', '29,819,114', '35,851,379', '34,017,028', '30,824,628', '58,032,443', '50,316,123', '36,343,858', '201,089,881', '31,445,012', '42,402,632', '54,858,851', '171,956,231', '30,569,484', '26,020,957', '14,841,338', '127,195,589', '42,469,946', '30,617,396', '2,523,610', '20,706,452', '6,708,147', '9,227,130', '67,347,895', '52,856,061', '115,253,424', '68,549,695', '77,339,130', '68,566,296']

对于Beauty Soup 4.6及以下版本,您可以单独安装Beauty Soup的新选择器库并使用它,即使它未集成在4.6中。只需通过
pip
pip安装soupsive

import soupsieve as sv

gross=[]

for div in soup.find_all('div', class_='lister-item mode-detail'):
    el = sv.select_one(':nth-child(2 of span[name*=nv])', div)
    if el is not None:
        gross.append(el['data-value'])

print(gross)

编辑:这是使用美丽的汤4.7+

就我个人而言,我会把你的选择范围缩小一点。实际上,您可以使用更好的选择器将目标锁定在所需的目标上。然后您可以使用
选择一个
,它将返回您想要的元素。然后,您可以通过查看它是否为
None
(表示您没有它)来检查您是否得到了它

你可以通过两种方式得到这个。首先,我将向您展示如何在CSS级别4中使用一个新功能:
:第n个子项(s的an+b)
。这将选择与选择器匹配的第二个量程

CSS规范:

或者,您可以使用自定义的
:contains
伪类,以
总值:
作为span后面的span的目标

输出:

['678,815,482', '700,059,566', '324,591,735', '417,719,760', '145,443,742', '213,515,506', '220,159,104', '137,690,172', '608,581,744', '216,210,777', '216,648,740', '213,767,512', '188,024,361', '51,024,708', '159,555,901', '215,288,866', '117,443,149', '159,342,015', '139,377,762', '120,634,935', '32,732,301', '57,421,715', '46,874,505', '174,532,921', '44,069,456', '335,061,807', '53,542,417', '99,345,950', '59,185,715', '102,084,362', '50,072,235', '69,001,013', '18,095,701', '100,407,760', '44,936,545', '48,686,605', '67,796,355', '54,547,470', '30,014,539', '69,086,325', '17,839,115', '81,903,458', '100,478,608', '99,215,042', '59,839,515', '2,474,044', '167,510,016', '21,704,844', '44,947,622', '115,715,889', '36,108,758', '28,780,744', '11,871,365', '48,795,601', '45,495,662', '1,214,525', '40,826,341', '40,717,020', '32,015,231', '21,023,275', '270,620,950', '33,562,069', '29,819,114', '35,851,379', '34,017,028', '30,824,628', '58,032,443', '50,316,123', '36,343,858', '201,089,881', '31,445,012', '42,402,632', '54,858,851', '171,956,231', '30,569,484', '26,020,957', '14,841,338', '127,195,589', '42,469,946', '30,617,396', '2,523,610', '20,706,452', '6,708,147', '9,227,130', '67,347,895', '52,856,061', '115,253,424', '68,549,695', '77,339,130', '68,566,296']

对于Beauty Soup 4.6及以下版本,您可以单独安装Beauty Soup的新选择器库并使用它,即使它未集成在4.6中。只需通过
pip
pip安装soupsive

import soupsieve as sv

gross=[]

for div in soup.find_all('div', class_='lister-item mode-detail'):
    el = sv.select_one(':nth-child(2 of span[name*=nv])', div)
    if el is not None:
        gross.append(el['data-value'])

print(gross)

索引错误是因为您没有选择()您认为您拥有的数据。你的span标签不能捕捉所有信息。我会使用find()函数查找父容器,然后循环遍历标记以获取您想要的内容,然后使用select()函数,您的span select与您想要的标记不匹配,在询问它之前测试它

您的索引错误是因为您没有选择()您认为您拥有的数据。你的span标签不能捕捉所有信息。我会使用find()函数查找父容器,然后循环遍历标记以获得您想要的内容,然后使用select()函数,您的span select与您想要的标记不匹配,请在询问之前测试它

谢谢您的回答。阅读并理解您正在执行的操作,但我得到了错误…”NotImplementedError:当我使用用于select\u one的:contains方法使用上述代码时,仅实现了以下伪类:类型的第n个。看起来当你运行它的时候,你不会得到那个错误。你知道为什么吗?你需要升级到BeautifulSoup4.7<代码>pip安装-U beautifulsoup4
。抱歉没有提及我使用的版本。我已经更新了帖子,展示了如何在BeautifulSoup4.6及以下版本中获得相同的行为。4.7中新的CSS选择器库也是一个独立的库,如果您直接使用它的API,它应该可以在较旧的Beauty Soup版本中工作。非常感谢,我学到了很多,并且能够解决这个问题。我真的很感激!谢谢你的回复。阅读并理解您正在执行的操作,但我得到了错误…”NotImplementedError:当我使用用于select\u one的:contains方法使用上述代码时,仅实现了以下伪类:类型的第n个。看起来当你运行它的时候,你不会得到那个错误。你知道为什么吗?你需要升级到BeautifulSoup4.7<代码>pip安装-U beautifulsoup4
。抱歉没有提及我使用的版本。我已经更新了帖子,展示了如何在BeautifulSoup4.6及以下版本中获得相同的行为。4.7中新的CSS选择器库也是一个独立的库,如果您直接使用它的API,它应该可以在较旧的Beauty Soup版本中工作。非常感谢,我学到了很多,并且能够解决这个问题。我真的很感激!
['678,815,482', '700,059,566', '324,591,735', '417,719,760', '145,443,742', '213,515,506', '220,159,104', '137,690,172', '608,581,744', '216,210,777', '216,648,740', '213,767,512', '188,024,361', '51,024,708', '159,555,901', '215,288,866', '117,443,149', '159,342,015', '139,377,762', '120,634,935', '32,732,301', '57,421,715', '46,874,505', '174,532,921', '44,069,456', '335,061,807', '53,542,417', '99,345,950', '59,185,715', '102,084,362', '50,072,235', '69,001,013', '18,095,701', '100,407,760', '44,936,545', '48,686,605', '67,796,355', '54,547,470', '30,014,539', '69,086,325', '17,839,115', '81,903,458', '100,478,608', '99,215,042', '59,839,515', '2,474,044', '167,510,016', '21,704,844', '44,947,622', '115,715,889', '36,108,758', '28,780,744', '11,871,365', '48,795,601', '45,495,662', '1,214,525', '40,826,341', '40,717,020', '32,015,231', '21,023,275', '270,620,950', '33,562,069', '29,819,114', '35,851,379', '34,017,028', '30,824,628', '58,032,443', '50,316,123', '36,343,858', '201,089,881', '31,445,012', '42,402,632', '54,858,851', '171,956,231', '30,569,484', '26,020,957', '14,841,338', '127,195,589', '42,469,946', '30,617,396', '2,523,610', '20,706,452', '6,708,147', '9,227,130', '67,347,895', '52,856,061', '115,253,424', '68,549,695', '77,339,130', '68,566,296']
import soupsieve as sv

gross=[]

for div in soup.find_all('div', class_='lister-item mode-detail'):
    el = sv.select_one(':nth-child(2 of span[name*=nv])', div)
    if el is not None:
        gross.append(el['data-value'])

print(gross)