【发布时间】:2020-01-05 20:18:30
【问题描述】:
我想从 Alexa 中提取与 <REACH RANK="1"/> 关联的整数。我的意思:
<!--
Need more Alexa data? Find our APIS here: https://aws.amazon.com/alexa/
-->
<ALEXA VER="0.9" URL="google.com/" HOME="0" AID="=" IDN="google.com/">
<SD TITLE="A" FLAGS="" HOST="google.com">
<OWNER NAME="aa"/>
</SD>
<SD>
<POPULARITY URL="google.com/" TEXT="1" SOURCE="panel"/>
<REACH RANK="1"/>
<RANK DELTA="+0"/>
<COUNTRY CODE="US" NAME="United States" RANK="1"/>
</SD>
</ALEXA>
到目前为止,我尝试过的是来自 Github 帖子的建议,并在尝试使用所述正则表达式模式的不同代码变体时混淆了 RegExr 上的正则表达式模式。
我目前拥有的:
try:
xml = (BeautifulSoup(urllib.request.urlopen("http://data.alexa.com/data?cli=10&dat=snbamz&url=" + url).read(), "xml"))
rank = re.search(r'"<REACH[^>]*RANK="(\d+")', xml)
print(rank)
print(f'Your rank for {url} is {rank}')
except Exception as err:
print(err)
rank = -1
#print(f'Your rank for {url} is {rank}')
它要么 1) 命中异常,要么 2) 导致此错误:
expected string or bytes-like object
【问题讨论】:
-
不要使用正则表达式解析结构化格式。这是 XML;使用 XML 解析器。 BeautifulSoup 包含用于提取 XPath 表达式的有用代码。
标签: regex python-3.x xml beautifulsoup