Python 预期为range()整数结束参数,获取标记

Python 预期为range()整数结束参数,获取标记,python,html,beautifulsoup,iteration,Python,Html,Beautifulsoup,Iteration,我正试图编写一个for循环来遍历由th和td标记组成的HTML表。它包含在URL中: https://www.saa.gov.uk/search.php?SEARCHED=1&SEARCH_TABLE=valuation_roll_cpsplit&SEARCH_TERM=edinburgh%2C+GOGARBANK%2C+EDINBURGH%2C+Edinburgh%2C+City+Of&x=16&y=8&DISPLAY_COUNT=10&ASSE

我正试图编写一个for循环来遍历由
th
td
标记组成的HTML表。它包含在URL中:

https://www.saa.gov.uk/search.php?SEARCHED=1&SEARCH_TABLE=valuation_roll_cpsplit&SEARCH_TERM=edinburgh%2C+GOGARBANK%2C+EDINBURGH%2C+Edinburgh%2C+City+Of&x=16&y=8&DISPLAY_COUNT=10&ASSESSOR_ID=&TYPE_FLAG=CP&ORDER_BY=PROPERTY_ADDRESS&H_ORDER_BY=SET+DESC&DRILL_SEARCH_TERM=GOGARBANK%2C+EDINBURGH%2C+Edinburgh%2C+City+Of&DD_UNITARY_AUTHORITY=Edinburgh%2C+City+Of&DD_TOWN=EDINBURGH&DD_STREET=GOGARBANK&DISPLAY_MODE=FULL&UARN=103G494E2%28B%29&PPRN=000000000000532&ASSESSOR_IDX=10&#results'
我认为
th
是表标题,我想提取
td
(表数据)。我尝试使用的
for
循环给了我一个错误:

range() integer end argument expected, got Tag.
有人能给我解释一下为什么吗?我想要的输出是

103G494E2(B)(LOTHIAN VJB)
YARD
我也尝试过使用
对于范围内的i(len(elems)):

但是它给了我一个错误,
类型为“int”的对象没有len()
。在这种情况下,
i
是否使用范围函数定义为整数?这个方法以前对我很有效,所以我不太清楚为什么这次不行。非常感谢

import requests
from bs4 import BeautifulSoup as soup
import csv

url = 'https://www.saa.gov.uk/search.php?SEARCHED=1&SEARCH_TABLE=valuation_roll_cpsplit&SEARCH_TERM=edinburgh%2C+GOGARBANK%2C+EDINBURGH%2C+Edinburgh%2C+City+Of&x=16&y=8&DISPLAY_COUNT=10&ASSESSOR_ID=&TYPE_FLAG=CP&ORDER_BY=PROPERTY_ADDRESS&H_ORDER_BY=SET+DESC&DRILL_SEARCH_TERM=GOGARBANK%2C+EDINBURGH%2C+Edinburgh%2C+City+Of&DD_UNITARY_AUTHORITY=Edinburgh%2C+City+Of&DD_TOWN=EDINBURGH&DD_STREET=GOGARBANK&DISPLAY_MODE=FULL&UARN=103G494E2%28B%29&PPRN=000000000000532&ASSESSOR_IDX=10&#results'
baseurl = 'https://www.saa.gov.uk'

session = requests.session()

response = session.get(url)

# content of search page in soup 
html = soup(response.content,"lxml")
# list of result entries
rslt_table = html.find("table", {"summary":"Property details"})

ref = 'n/a'
vsr = 'n/a'

for col in rslt_table:
    elems = col.find("th")
    data = col.find("td")
    #for i in range(len(elems)):
    for i in range(elems):
        if elems [i].text == "Ref No. / Office":
            ref = data[i].text
            print ref
        if elems [i].text == 'Description':
            vsr = data[i].text
            print vsr

您不需要使用range,您应该使用
enumerate()
只需使用
for i,elem in enumerate(elems)
,然后检查
elem
而不是
elems[i]
。使用
enumerate
还可以跟踪索引,以便访问
数据中的正确元素

for循环将如下所示:

for col in rslt_table:
    elems = col.find_all("th")
    data = col.find_all("td")
    for i,elem in enumerate(elems):
        if elem.text == "Ref No. / Office":
            ref = data[i].text
            print ref
        if elem.text == 'Description':
            vsr = data[i].text
            print vsr
您还应该使用
find_all()
而不是
find()
来获取项目列表,而不仅仅是单个项目。因此,您的
rslt\u表应该如下所示:

rslt_table = html.find_all("table", {"summary":"Property details"})

你犯了好几个错误。首先,find返回单个元素-要获取元素集合,必须在所有位置使用find_all。范围不包含元素,也不包含列表;使用枚举()或范围(len())

固定代码将是

rslt_table = html.find_all("table", {"summary":"Property details"})

for col in rslt_table:
    elems = col.find_all("th")
    data = col.find_all("td")
    for i, e in enumerate(elems):
        if e.text == "Ref No. / Office":
            ref = data[i].text
            print(ref)
        if e.text == 'Description':
            vsr = data[i].text
            print(vsr)

谢谢你的回复。我仍然得到一个整数错误,但是对于I,elem in enumerate(elems):TypeError:“int”对象不是iterablein除了wpercy所说的之外,您可能使用了错误的方法。从bs4文档中:
唯一的区别是find_all()返回一个包含单个结果的列表,而find()只返回结果。
因此您可能需要尝试使用find_all()所有这些
find
s应该是
find_all
s!谢谢,我按照wpercy的建议使用了枚举行,并将elems=col.find_all(“th”)放入其中,但得到了一个属性错误AttributeError:'navigablesting'对象没有属性'find_all'-谢谢。将rslt_table=html更改为find_all,它也起了作用。