python - 如何使用正则表达式从一个部分中查找选项值

标签 python html regex expression dropdown

我搜索过但没有找到正确的答案,可能是我的搜索查询不正确。但至于这个问题,我在下面的 html 文档中有下拉值。

   <select style="background: red; color: #fff; padding: 5px;" class="mainNewcat" size="1">
<option>My New List</option>
<option value="http://www.google.com/value1.html">Value 1</option><option value="http://www.google.com/value2.html">Value 2</option><option value="http://www.google.com/value3.html">Value 3</option> </select>
<select style="background: green; color: #fff; padding: 5px;" class="mainOldcat" size="1">
<option>My Old List</option>
<option value="http://www.yahoo.com/cat1.html">Category 1</option><option value="http://www.yahoo.com/cat2.html">Category 2</option><option value="http://www.yahoo.com/cat3.html">Category 3</option> </select>

我正在寻找的是仅来自“我的新列表”的 url 和文本。到目前为止,我拥有的正则表达式解决方案是首先在“我的新列表”中搜索选项值 block ,然后使用另一个正则表达式从第一个结果中搜索 url 和文本,如下所示使用 python 的 RE 模块。

main_regex = re.compile('<select.+?\n.+?New.+?\n(.+?)<\/select>').findall(html)
final_regex = re.compile('value="(.+?)">(.+?)</option>').findall(main_regex)

有没有比我现有的更好的解决方案?或者我应该使用一些解析器而不是正则表达式?

最佳答案

您如何使用 HTML 解析器 来解析 HTML?使用 BeautifulSoup 的示例:

from bs4 import BeautifulSoup

data = """
<select style="background: red; color: #fff; padding: 5px;" class="mainNewcat" size="1">
    <option>My New List</option>
    <option value="http://www.google.com/value1.html">Value 1</option>
    <option value="http://www.google.com/value2.html">Value 2</option>
    <option value="http://www.google.com/value3.html">Value 3</option>
</select>

<select style="background: green; color: #fff; padding: 5px;" class="mainOldcat" size="1">
    <option>My Old List</option>
    <option value="http://www.yahoo.com/cat1.html">Category 1</option>
    <option value="http://www.yahoo.com/cat2.html">Category 2</option>
    <option value="http://www.yahoo.com/cat3.html">Category 3</option>
</select>
"""
soup = BeautifulSoup(data, "html.parser")

for option in soup.select("select.mainNewcat > option[value]"):
    print(option["value"], option.text)  # hiding the important link here: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

打印:

(u'http://www.google.com/value1.html', u'Value 1')
(u'http://www.google.com/value2.html', u'Value 2')
(u'http://www.google.com/value3.html', u'Value 3')

这里我们使用 CSS selectors 来匹配 option 元素,具有 value 属性,直接位于具有“mainNewcat”的 select 元素内类。


仅供引用,我们可以从不同的角度看问题 - 首先找到带有“我的新列表”文本的选项,然后查看下一个选项 siblings:

my_new_list_option = soup.find("option", text="My New List")
for option in soup.find_next_siblings("option", value=True):
    print(option["value"], option.text)

关于python - 如何使用正则表达式从一个部分中查找选项值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33383063/

相关文章:

regex - xsd:SimpleType:如何将属性限制为特定值和正则表达式值

python - 创建 matplotlib 图形后如何释放内存

python - 打开文件的密码但没有运行文件的密码

python - 如何在Python中定义空格?

Python:如何从 argparse 获取所有默认值

javascript - 为什么 Particles-js 不能正常工作?

css - Div 里面的 anchor 错误

PHP Mongo 正则表达式

c# - 通过正则表达式验证文件类型

python - 使用 lxml、xpath 在 Python 中解析 HTML