range()期望整数结束参数,得到Tag

时间:2017-03-02 19:35:29

标签: python html beautifulsoup iteration

我尝试编写for循环来浏览包含.done()th标记的HTML表格。它包含在URL中:

td

我认为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

但它给了我一个错误for i in range(len(elems)):。在这种情况下,使用范围函数将object of type 'int' has no len()定义为整数吗?这种方法以前对我有用,所以不太确定为什么这次会这样做。非常感谢。

i

2 个答案:

答案 0 :(得分:1)

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

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_table应该是这样的:

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

答案 1 :(得分:0)

你犯了几个错误。首先,find返回一个元素 - 要获取元素集合,必须在任何地方使用find_all。范围不是一个元素,也不是一个列表;使用enumerate()或range(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)