трактовать '\ xa0' как пробел в регулярном выражении в python - PullRequest
0 голосов
/ 27 февраля 2020

Я строю веб-скребок для получения данных с использованием Selenium и BS4. Я получаю html после полной загрузки страницы с помощью Selenium. Затем я создаю объект BeautifulSoup, используя page_source страницы, открытой в Selenium. После этого я начинаю синтаксический анализ html, чтобы найти определенные c элементы на странице. Мне нужно использовать регулярные выражения для анализа некоторых строк. Однако некоторые неразрывные пробелы (не все) обрабатываются как символы '\ xa0'. Это создает проблему с поиском регулярных выражений python (которые не обрабатывают их как пробелы).

Например, у меня есть следующая строка:

import re
import unicodedata
testString ="JM Wing\xa0- ...\xa0Transactions of the Royal Society A\xa0..., 2008 - royalsocietypublishing.org"

У меня есть попробовал несколько из следующих решений, согласно тому, что я нашел в Интернете, но ни одно из них, кажется, не работает. (Обратите внимание, что исходный html .page_source возвращает объект байтов, поэтому я попытался использовать декодирование.

testString = testString.replace(u'\xa0', u' ').encode('utf-8') #turns string into bytes
testString = testString.decode(encoding="utf-8",errors="ignore") #must be a bytes object
testString = unicodedata.normalize("NFKD", testString)

Независимо от того, что я пытаюсь, я не могу избавиться от '\ xa0 'символы и регулярные выражения не будут видеть это как пробелы. Любая идея, как я мог бы решить это? Я хотел бы, чтобы мой суп-объект был в utf-8, так как я потенциально имею дело с символами из нескольких языков. Но я действительно нужно превратить их в пробелы, чтобы я мог использовать регулярные выражения для разбора строк, которые не семантически размечены в html.

РЕДАКТИРОВАТЬ: я могу запустить следующее и получить нужную строку, но захват Скобки, кажется, не получают только часть, которую я хочу (и поэтому я получаю "-... \ ax0" и "," до и после строки).

foundString = re.search('-.*([a-zA-Z]*),',testString)[0]

this возвращает ". .. \ xa0Транзакции Королевского общества A \ xa0 ..., ". В идеале я хотел бы получить только слова" Транзакции ... Общество ", что должно указывать в скобках. Любопытно, что я могу получить только это результат с re.search (). Напротив, re.findall () просто возвращает пустая строка.

1 Ответ

0 голосов
/ 27 февраля 2020

Я вроде нашел решение. Так как строка, которая первой встречается, это html, рассматриваемые пробелы на самом деле   Итак, после очистки html и перед тем, как превратить его в суп, я использую следующий код для замены   и затем преобразуйте его в байтовую строку.

html = html.replace(" ",' ').encode('utf-8')

Это, кажется, избавляет от всех случаев \ xa0 после этого.

Любопытная проблема заключается в захвате скобок в регулярные выражения по-прежнему не работают, и если я использую re.findall, я получаю пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...