python - 解析 HTML 中的特定值

python - Parse specific value in an HTML

亲爱的社区,晚上好。我今晚的问题如下:我有这张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']

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

创建一个字典,将每个 option 的文本映射到它的值,确保从 text:

中去除所有无关的空格
d = {option.text.strip(): option['value'] for option in soup.find_all('option')}
print(d['(EU 40 - US 7)'])

结果:

12_636

你也可以使用 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"))