2015-10-28 4 views
2

Я искал, но не смог найти правильный ответ, возможно, мой поисковый запрос неверен. Но что касается вопроса, у меня ниже в html-документе для выпадающих значений.как найти значения параметра из одного раздела с помощью Regex

<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 и текст только из «Мой новый список». До сих пор регулярное решение, которое я имею, - это сначала поиск блока значений параметра в «My New List», а затем другое регулярное выражение для поиска url и текста из первого результата, например, ниже, в котором используется модуль RE python.

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".


Просто FYI, мы можем взглянуть на проблему под другим углом - сначала найдите option с текстом «My New Список», а затем посмотреть на следующий 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

Дерьмо. Ваше решение было бы идеальным решением, но я хотел держаться подальше от beautifulsoup, поскольку это вызывает проблемы с производительностью на нижних конечных устройствах, таких как (Rpi). У одних и тех же устройств улучшенная производительность с регулярным выражением, чем у красивых. – user1819085

+0

@ user1819085 ну, мы можем работать над тем, чтобы он работал быстрее, если это так. Мы можем начать с использования 'lxml' в качестве базового анализатора:' BeautifulSoup (data, "lxml") 'или используя классы фильтра супа для анализа только соответствующих частей страниц. – alecxe