2015-10-28 32 views
2

我已經搜索,但無法找到正確的答案,也許我的搜索查詢不正確。但至於這個問題,我有下面的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和文本,如下面使用python的RE模塊。

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

有沒有比我有更好的解決方案?或者我應該使用一些解析器,而不是正則表達式?

回答

0

如何解析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屬性,直接位於一個select元件具有 「mainNewcat」 類中。


僅供參考,大家可以看一下這個問題從不同的角度 - 首先找到option與「我的新名單」的文字,然後尋找到明年optionsiblings

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) 
+0

廢話。您的解決方案是理想的解決方案,但我希望避免使用美麗的選項,因爲它會導致像(Rpi)這樣的低端設備出現性能問題。正則表達式的設備比美麗的表現更好。 – user1819085

+0

@ user1819085好吧,如果是這種情況,我們可以加快工作速度。我們可以先使用'lxml'作爲底層解析器:'BeautifulSoup(data,「lxml」)'或者使用湯過濾器類來解析頁面的相關部分。 – alecxe