2015-08-14 6 views
0

Я пытаюсь найти конкретное значение в ответ HTML с использованием библиотеки запросовСтрока поиска для конкретного значения =

import requests 

while True: 

url = 'https://www.example.com/' 

page = requests.get(url, allow_redirects=True, verify=False) 

var = page.content 

значение, казалось бы, как словарь, но я не могу конвертировать весь ответ .content к dict, используя: var = dict (page.content), поскольку он дает ошибку "элемент последовательности обновления словаря # 0 имеет длину 1; требуется 2"

Я попытался использовать метод re.search, такой как это:

searchObj = re.search(r'(.*)id="X" value=(.*?) .*', var, re.M) 
if searchObj: 
    print "search --> searchObj.group() : ", searchObj.group() 

, но это не то, что я ищу - конечная цель состоит в том, чтобы найти конкретное значение в контенте, возвращенном из запроса веб-сайта, оно будет выглядеть примерно так: <input type="hidden" autocomplete="off" name="test" id="test" value="12345" /> - с данными, которые необходимо извлечь как значение = «12345» или более конкретно только 12345

заранее спасибо

+2

Используйте beautifulsoup, найдите тег и извлеките атрибут –

+0

Я действительно очень надеюсь, что вы либо владеете этим сайтом, либо разговариваете с владельцем, потому что, если вы не знаете, что делаете, и вы нажимаете эту страницу с бесконечным кто-то будет очень справедливо злиться на вас. –

+0

@ Two-BitAlchemist, пока вы правы, что он не должен царапать страницу с бесконечным циклом без тайм-аута, это действительно не имеет значения. Большинство современных сайтов построены с помощью Apache или Nginx, и они закроют его соединение, если в течение короткого периода времени будет сделано слишком много попыток подключения. –

ответ

0

Предпочтительно анализировать XML и HTML с использованием специализированной библиотеки, но если это одноразовая операция, а выход является предсказуемым, нормально использовать регулярное выражение. Следующие re должны работать.

r'id=\"test\"\svalue=\"(.*?)\"' 

(.*) в начале захватывает все.

+0

searchObj = re.search (r'id = \ "X \" \ svalue = \ "(. *?) \" ', var, re.M | re.I) если поискObj: печать поискObj. group (1) else: print «Ничего не найдено !!» Используя ваш комментарий, я смог начать извлекать только то, что мне нужно от ответов - оцените его –

1

не следует использовать регулярное выражение для этого использовать библиотеку, которая была сделана для того, например BeautifulSoup:

import bs4 as bs 
import requests 

resp = requests.get('http://www.google.com') 
soup = bs.BeautifulSoup(resp.text) 
element = soup.find(attrs={'id': 'hplogo'}) # will search for the 'google' logo 
print element 

>> <div align="left" id="hplogo" onload="window.lol&amp;&amp;lol()" style="height:110px;width:276px;background:url(/images/srpr/logo9w.png) no-repeat" title="Google"><div nowrap="" style="color:#777;font-size:16px;font-weight:bold;position:relative;top:70px;left:218px">׳™׳©׳¨׳�׳�</div></div> 
+1

http://stackoverflow.com/a/1732454/2588818 –

+0

Один из моих любимых сообщений на сайте! –

+0

Это работает, чтобы распечатать весь элемент - но я ищу только 1 значение = "" и т. Д. - отлично работает, чтобы печатать только тот подраздел, который я искал, но мне нужно его доработать. Ty до сих пор –

1

Это должно сработать для вас:

import re 
import requests 

VALUE_RGX = re.compile(r'id="X" value="([A-Za-z0-9_\-]+)"') 

url = 'https://www.example.com/' 
page = requests.get(url, allow_redirects=True, verify=False) 

matched_groups = VALUE_RGX.match(page.text) 
if len(matched_groups) > 1: 
    print("Found Value: {}".format(matched_groups[1])) 
else: 
    print("Did not find value..") 
+0

ошибка "if len (matched_groups> 0): TypeError: объект типа 'bool' не имеет len() –

+0

Упс, имел опечатку. Должно быть' len (matched_groups)> 1'. post –

Смежные вопросы