正则表达式错误
Regex Expression wrong
我正在尝试从以下短语中提取国家/地区(这里是印度尼西亚):
<small class="text-muted">
<span class="hidden-xs">Football / </span>Indonesia /
<span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30 </small>
目前,我只是使用以下命令来提取文本:
.xpath('.//small[@class="text-muted"]/text()').extract()
仅提取印度尼西亚的正确正则表达式命令是什么?
也许,从 bs4
导入 BeautifulSoup
,我们可以提取国家,如果这样的话:
from bs4 import BeautifulSoup
import re
string="""
<small class="text-muted">
<span class="hidden-xs">Football / </span>Indonesia /
<span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30 </small>
A
"""
soup = BeautifulSoup(string, 'html.parser').find_all('small')[0].text
print(re.findall(r'[^/]+/\s*([^/]+?)\s*/', soup)[0])
输出
Indonesia
您可以使用这个 XPath-1.0 表达式:
//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()
结果为 Indonesia /
.
如果你想摆脱斜线,你有几种可能性:
删除表达式中的所有斜线:
normalize-space(translate(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/",""))
用substring-before()
得到斜线前的字符串:
normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/"))
用substring-before()
得到第一个space之前的字符串:
normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()," "))
还有其他 XPath 表达式也可以使用。选择最适合您情况的一项。 //
之前的前导点只有在指定当前节点的相对路径时才需要。在上面的表达式中,我确实假设查找是全局的。
当然,这些 XPath 表达式必须用
包围
.xpath('...').extract()
问题是,你对输入法了解多少?你显然不知道它包含"Indonesia",但输入的其他部分是否完全固定?例如,您要查找的文本是否总是紧跟在内容为 Football /
?
的 span 元素之后
如果是这样的话你可以做
//small[@class="text-muted"]/span[. = Football / ']/following-sibling::text()[1]
我正在尝试从以下短语中提取国家/地区(这里是印度尼西亚):
<small class="text-muted">
<span class="hidden-xs">Football / </span>Indonesia /
<span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30 </small>
目前,我只是使用以下命令来提取文本:
.xpath('.//small[@class="text-muted"]/text()').extract()
仅提取印度尼西亚的正确正则表达式命令是什么?
也许,从 bs4
导入 BeautifulSoup
,我们可以提取国家,如果这样的话:
from bs4 import BeautifulSoup
import re
string="""
<small class="text-muted">
<span class="hidden-xs">Football / </span>Indonesia /
<span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30 </small>
A
"""
soup = BeautifulSoup(string, 'html.parser').find_all('small')[0].text
print(re.findall(r'[^/]+/\s*([^/]+?)\s*/', soup)[0])
输出
Indonesia
您可以使用这个 XPath-1.0 表达式:
//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()
结果为 Indonesia /
.
如果你想摆脱斜线,你有几种可能性:
删除表达式中的所有斜线:
normalize-space(translate(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/",""))
用
substring-before()
得到斜线前的字符串:normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/"))
用
substring-before()
得到第一个space之前的字符串:normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()," "))
还有其他 XPath 表达式也可以使用。选择最适合您情况的一项。 //
之前的前导点只有在指定当前节点的相对路径时才需要。在上面的表达式中,我确实假设查找是全局的。
当然,这些 XPath 表达式必须用
包围.xpath('...').extract()
问题是,你对输入法了解多少?你显然不知道它包含"Indonesia",但输入的其他部分是否完全固定?例如,您要查找的文本是否总是紧跟在内容为 Football /
?
如果是这样的话你可以做
//small[@class="text-muted"]/span[. = Football / ']/following-sibling::text()[1]