【问题标题】:python - Parse specific value in an HTMLpython - 解析 HTML 中的特定值
【发布时间】:2019-06-07 09:38:18
【问题描述】:

晚上好,亲爱的社区。我今晚的问题如下:我有这段 HTML:

                      <option class="disabled" value="12_654" >
(EU 38 2/3 - US 6)                      </option>
                      <option class="disabled" value="12_3716" >
(EU 39 1/3 - US 6,5)                      </option>
                      <option class="disabled" value="12_636" >
(EU 40 - US 7)                      </option>
                      <option class="" value="12_634" >
EU 40 2/3 - US 7,5                      </option>
                      <option class="" value="12_462" >
EU 41 1/3 - US 8                      </option>
                      <option class="" value="12_460" >
EU 42 - US 8,5                      </option>
                      <option class="" value="12_459" >
EU 42 2/3 - US 9                      </option>
                      <option class="" value="12_458" >
EU 43 1/3 - US 9,5                      </option>
                      <option class="" value="12_457" >
EU 44 - US 10                      </option>
                      <option class="" value="12_456" >
EU 44 2/3 - US 10,5                      </option>
                      <option class="" value="12_455" >
EU 45 1/3 - US 11                      </option>
                      <option class="disabled" value="12_559" >
(EU 46 - US 11,5)                      </option>
                      <option class="disabled" value="12_454" >
(EU 46 2/3 - US 12)                      </option>
                      <option class="disabled" value="12_453" >
(EU 47 1/3 - US 12,5)                      </option>
                    </sel

这只是一个例子......我现在的目标是通过给出大小来找到特定大小的值。例如:

如果我指出我的尺寸是 EU 40 - US 7,我希望能够解析值 12_636

我之前已经使用 bs4 模块来解析 HTML 并查找特定值,我通常这样做:

from bs4 import BeautifulSoup as bs

soup=bs(html.text, 'lxml')
v=soup.find('option',{'class':''})['value']

但是在这里,因为使用上面的方法会有更多可能的值,这不是我需要的。我尝试在要查找的标签中添加所需的尺寸,但没有奏效。

v=soup.find('option',(EU 40 - US 7),{'class':''})['value']

看起来像这样,但是我知道,这是不正确的。现在我完全不知道如何找到价值,所以我会非常感谢我得到的任何帮助。非常感谢亲爱的社区!

【问题讨论】:

    标签: python web-scraping beautifulsoup screen-scraping


    【解决方案1】:

    创建一个将每个option 的文本映射到其值的字典,确保从text 中去除所有无关的空格:

    d = {option.text.strip(): option['value'] for option in soup.find_all('option')}
    print(d['(EU 40 - US 7)'])
    

    结果:

    12_636
    

    【讨论】:

    • 这对我有用,感谢您花时间回答。非常感谢!
    【解决方案2】:

    您也可以使用 xpath 和 fromstring

    # import requests
    from lxml.html import fromstring
    # url = ''
    # tree = html.fromstring( requests.get(url).content)
    h = '''
     <option class="disabled" value="12_654" >
    (EU 38 2/3 - US 6)                      </option>
                          <option class="disabled" value="12_3716" >
    (EU 39 1/3 - US 6,5)                      </option>
                          <option class="disabled" value="12_636" >
    (EU 40 - US 7)                      </option>
                          <option class="" value="12_634" >
    EU 40 2/3 - US 7,5                      </option>
                          <option class="" value="12_462" >
    EU 41 1/3 - US 8                      </option>
                          <option class="" value="12_460" >
    EU 42 - US 8,5                      </option>
                          <option class="" value="12_459" >
    EU 42 2/3 - US 9                      </option>
                          <option class="" value="12_458" >
    EU 43 1/3 - US 9,5                      </option>
                          <option class="" value="12_457" >
    EU 44 - US 10                      </option>
                          <option class="" value="12_456" >
    EU 44 2/3 - US 10,5                      </option>
                          <option class="" value="12_455" >
    EU 45 1/3 - US 11                      </option>
                          <option class="disabled" value="12_559" >
    (EU 46 - US 11,5)                      </option>
                          <option class="disabled" value="12_454" >
    (EU 46 2/3 - US 12)                      </option>
                          <option class="disabled" value="12_453" >
    (EU 47 1/3 - US 12,5)                      </option>
                        </sel
    '''
    tree = fromstring(h)
    print(tree.xpath("//option[text()[contains(.,'(EU 40 - US 7)')]]/@value"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2013-12-24
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多