【问题标题】:How to select all stateid and state name from this inspect element如何从此检查元素中选择所有 stateid 和 state name
【发布时间】:2016-03-20 13:41:36
【问题描述】:

我想通过 beautifulsoup 从下面的代码中选择所有值名称及其状态 ID。 请任何人告诉如何编写 beautifulsoup 脚本来废弃所有 stateid 和 state name

    <select id="stateId" class="states" name="state" required="required">
<option value="">Select State</option>
<option value="Andaman and Nicobar Islands" stateid="1">Andaman and Nicobar Islands</option>
<option value="Andhra Pradesh" stateid="2">Andhra Pradesh</option>
<option value="Arunachal Pradesh" stateid="3">Arunachal Pradesh</option>
<option value="Assam" stateid="4">Assam</option>
<option value="Bihar" stateid="5">Bihar</option>
<option value="Chandigarh" stateid="6">Chandigarh</option>
<option value="Chhattisgarh" stateid="7">Chhattisgarh</option>
<option value="Dadra and Nagar Haveli" stateid="8">Dadra and Nagar Haveli</option>
<option value="Daman and Diu" stateid="9">Daman and Diu</option>
<option value="Delhi" stateid="10">Delhi</option>
<option value="Goa" stateid="11">Goa</option>
<option value="Gujarat" stateid="12">Gujarat</option>
<option value="Haryana" stateid="13">Haryana</option>
<option value="Himachal Pradesh" stateid="14">Himachal Pradesh</option>

【问题讨论】:

    标签: python django beautifulsoup


    【解决方案1】:

    为此,我设计了一个列表推导式,它使用findAll 循环遍历所有“选项”元素并获取它们的状态 ID 和状态名称:

    [(x["stateid"], x["value"]) for x in bs.findAll("option") if x["value"] != ""]
    

    我这样使用列表推导:

    >>> import bs4
    >>> bs = bs4.BeautifulSoup(<your text>)
    >>> [(x["stateid"], x["value"]) for x in bs.findAll("option") if x["value"] != ""]
    [('1', 'Andaman and Nicobar Islands'), ('2', 'Andhra Pradesh'), ('3', 'Arunachal Pradesh'), ('4', 'Assam'), ('5', 'Bihar'), ('6', 'Chandigarh'), ('7', 'Chhattisgarh'), ('8', 'Dadra and Nagar Haveli'), ('9', 'Daman and Diu'), ('10', 'Delhi'), ('11', 'Goa'), ('12', 'Gujarat'), ('13', 'Haryana'), ('14', 'Himachal Pradesh')]
    

    它返回一个元组列表,每个元组的第一个元素是状态 ID,第二个元素是状态名称。它还通过使用if x["value"] != "" 省略开头的空白值。

    【讨论】:

      【解决方案2】:

      要改进 OrangeFlash81 的建议,您可以使用 find_all() 传递 value=lambda x: x 以避免提取第一个“空”选项:

      select = soup.find("select", id="stateId")
      options = [(option["stateid"], option["value"]) 
                 for option in select.find_all("option", value=lambda x: x)]
      print(options)
      

      或者,CSS selector 通过切片结果集跳过第一个“空”选项:

      options = [(option["stateid"], option["value"])
                 for option in soup.select("#stateId option")[1:]]
      print(options)
      

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 2014-10-15
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多