gpt4 book ai didi

python - 使用 lxml 解析 html - 如何指定 1 - 3 位通配符以使我的代码不那么脆弱?

转载 作者:数据小太阳 更新时间:2023-10-29 02:54:22 25 4
gpt4 key购买 nike

我正在尝试使用 xml 从 yahoo finance 中抓取“部门”和“行业”字段。

我注意到 href url 始终是 http://biz.yahoo.com/ic/ xyz.html,其中 xyz 是数字。

您能否建议包含 1 位或多位数字的通配符的方法?我尝试了几种基于 Google 和堆栈搜索的方法,但没有任何效果。

import lxml.html
url = 'http://finance.yahoo.com/q?s=AAPL'
root = lxml.html.parse(url).getroot()
for a in root.xpath('//a[@href="http://biz.yahoo.com/ic/' + 3 digit integer wildcard " +'.html"]')
print a.text

最佳答案

纯 XPath 1.0 解决方案(无扩展功能):

//a[starts-with(@href, 'http://biz.yahoo.com/ic/')
and
substring(@href, string-length(@href)-4) = '.html'
and
string-length
(substring-before
(substring-after(@href, 'http://biz.yahoo.com/ic/'),
'.')
) = 3
and
translate(substring-before
(substring-after(@href, 'http://biz.yahoo.com/ic/'),
'.'),
'0123456789',
''
)
= ''
]

这个 XPath 表达式可以像这样“读成英语”:

选择文档中的任意a,其href属性的字符串值以字符串"'http://biz.yahoo .com/ic/" 并以字符串 ".html" 结尾,开始和结束子字符串之间的子字符串长度为 3,并且这个相同的子字符串仅包含数字

基于 XSLT 的验证:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<xsl:copy-of select=
"//a[starts-with(@href, 'http://biz.yahoo.com/ic/')
and
substring(@href, string-length(@href)-4) = '.html'
and
string-length
(substring-before
(substring-after(@href, 'http://biz.yahoo.com/ic/'),
'.')
) = 3
and
translate(substring-before
(substring-after(@href, 'http://biz.yahoo.com/ic/'),
'.'),
'0123456789',
''
)
= ''
]
"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<html>
<body>
<a href="http://biz.yahoo.com/ic/123.html">Link1</a>
<a href="http://biz.yahoo.com/ic/1234.html">Incorrect</a>
<a href="http://biz.yahoo.com/ic/x23.html">Incorrect</a>
<a href="http://biz.yahoo.com/ic/621.html">Link2</a>
</body>
</html>

计算 XPath 表达式并将所选节点复制到输出:

<a href="http://biz.yahoo.com/ic/123.html">Link1</a>
<a href="http://biz.yahoo.com/ic/621.html">Link2</a>

正如我们所见,只选择了正确的、需要的 a 元素

关于python - 使用 lxml 解析 html - 如何指定 1 - 3 位通配符以使我的代码不那么脆弱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com