Джихан частично прав, в том смысле, что в явном виде BeautifulSoup
нет синтаксических анализаторов javascript.Вам все еще, вероятно, понадобится bs4
для выполнения начального анализа.Регулярные выражения могут помочь вам разобраться со строками, но я бы использовал скомпилированное регулярное выражение вместо выполнения re.findall()
.Использование re.findall()
может привести к множеству ложных срабатываний и очистке для вас.Если вы выполняете регулярное регулярное выражение, вы можете быть намного увереннее, что получаете правильные данные и выполняете проверку во время итерации.Это также в конечном итоге приводит к более чистому коду и более управляемому выводу.
Вместо этого вы можете явно вытянуть тег <script>
из содержимого страницы и использовать метод str.splitlines()
для нужного тега сценария.Это разделит весь тег на список строк.Возможно, вы захотите разбить символ ;
, который обозначает завершение строки JavaScript, чтобы он работал даже в тех случаях, когда вы имеете дело с «оптимизированным» (запутанным) кодом JavaScript, который яростно разбит вместе.
В этот момент вы можете использовать скомпилированное (или простое re.search()
) регулярное выражение в каждой строке.Таким образом, вы уверены, что вы получаете построчное соответствие.Вот код.
import argparse
import bs4
import re
import requests
def parse_county_codes(soup_object):
for tag in soup_object:
tag = str(tag)
lines = tag.splitlines()
code_regex = re.compile('"[+]\'(.*?)\'[+]"')
county_regex = re.compile('\'[ ]>(.*?)<')
for line in lines:
county = county_regex.search(line)
code = code_regex.search(line)
if county and code:
print(county.group(1), ':', code.group(1))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input-file', dest='in_file', help='Input html')
parser.add_argument('-u', '--url', dest='url', help='Some url\'s content you want to parse')
args = parser.parse_args()
if args.in_file:
with open(args.in_file) as f:
html_string = f.read()
soup = bs4.BeautifulSoup(html_string, 'html.parser')
elif args.url:
try:
# Remember to handle any possible url handling exceptions
response = requests.get(args.url)
except Exception as e:
print("The following exception occurred while requesting the url\n{0}".format(args.url))
print(e)
return
soup = bs4.BeautifulSoup(response.content, 'html.parser')
else:
print("Input missing. Please provide -i or -u")
return
script_tags = soup.find_all('script')
parse_county_codes(script_tags)
if __name__ == '__main__':
main()
Вывод этого кода следующий:
Región I : 101
Alto Hospicio : 2307
Arica : 2101
Camarones : 2102
Camiña : 2303
Colchane : 2304
General Lagos : 2202
Huara : 2302
Iquique : 2301
Pica : 2305
Pozo Almonte : 2306
Putre : 2201
Обратите внимание, что есть некоторые символы и escape-последовательности для специальных символов, которые выглядят неуместно встроки, но регулярные выражения в их текущей форме, предоставленные Jihan, действительны.Если вы хотите очистить вывод, вы лучше знаете, как это сделать, поэтому я оставлю это на ваше усмотрение.Помните, что ваш пробег может отличаться при использовании регулярных выражений, и в зависимости от содержимого других веб-страниц вы можете столкнуться с другими проблемами.