【问题标题】:How to verify if tr/table/td exists如何验证 tr/table/td 是否存在
【发布时间】:2017-12-30 19:36:32
【问题描述】:

我正在使用 mechanize 浏览器来检索一些信息。 在搜索表单中,如果没有结果,我的代码不起作用

这是我的代码

list_src =["keyword1","gdfgz", "keyword2"]
i = 0
while (i < 2):
        br2 = mechanize.Browser()
        br2.set_cookiejar(cj)
        br2.open("https://url")
        br2.select_form(nr=0) # this is the search form
        br2.form['sq'] = liste_src[i]
        res2 = br2.submit()
        html2 = res2.read() 
        soup = BeautifulSoup(html2, 'lxml')
        table1 = soup.findAll("table",{ "width" : "100%" })[13] 
        tr1 = table1.findAll('tr')[3] 
        table2 = tr1.findAll("table",{ "width" : "100%" })[0]
        tr2 = table2.findAll('tr')[1] 

我的错误信息:

tr2 = table2.findAll('tr')[1] IndexError: 列表索引超出范围

当没有结果时,没有这个tr。 所以我尝试添加 如果不是 tr,则打印 'no results' 但它不起作用。 我该如何解决这个问题?

【问题讨论】:

  • try: ... catch IndexError: ...
  • @zvadym 你的意思是try....except
  • @Code-Apprentice 对,谢谢 :)
  • 你可以看看用 css 选择器来获取东西,比如:tr1 = soup.select_one('table:nth-of-type(14) tr:nth_of_type(4)') 然后检查它是否返回任何东西并采取适当的行动,甚至类似:print(getattr(tr1, 'text', 'No results!'))

标签: python mechanize


【解决方案1】:

您可以检查 tr2(或任何其他列表)的长度,然后根据列表长度迭代所有元素...或者如果 index

idx = 1
tab2trs = table2.findAll('tr')
tr2 = None
if idx < len(tab2trs):
    tr2 = tab2trs[idx]

或者你可以添加一个尝试,除了...

try:
    tr2=table2.findAll('tr')[1]
except IndexError:
    pass

【讨论】:

  • 使用if 语句进行逻辑控制优于捕获异常。
  • @Code-Apprentice 为什么会这样?在这种情况下,它应该存在 - 如果不是 - 这是一个异常,如果需要,可以在其他地方处理......无需通过长度检查来笨拙的代码......