【问题标题】:Python parsing multiple url into array from XMLPython将多个url从XML解析为数组
【发布时间】:2014-11-20 18:29:11
【问题描述】:

我想从一个节点中提取多个 url 并将它们放入一个字符串数组中。目前我正在将所需节点中的所有文本保存到一个字符串中;

imgsUrl= value.text

然后我正在解析字符串并获取正确的 url。

imgsUrl[imgUrl.find("http://"):imgUrl.find(".JPG")+4]

我的问题是我可能需要来自 imgsUrl 的 1-200 个 url,而我只能获得其中一个。有没有一个好的解决方案可以将它们全部放入一个不那么乏味的数组中?

样本输入:

sampleStr="<ul><li><a href="http://website/abc/vcd/HHD00300.JPG">HHD00300.JPG</a></li>
<li><a href="http://website/abc/vcd//HHD003002.jpg">HHD003002.jpg</a></li></ul>"

输出:

print imgUrlSubString
outputs this:  http://website/abc/vcd//HHD003000.JPG

预期输出:

['http://website/abc/vcd//HHD003000.JPG','http://website/abc/vcd//HHD003002.JPG',....]

【问题讨论】:

  • 您可以发布示例输入和预期输出吗?
  • 正则表达式应该可以解决问题。请参阅 [this][1] 答案。 [1]:stackoverflow.com/a/6883094/447599
  • @vikramls 好的示例输入和相应的输出已包含
  • @Julius 这似乎工作得很好。这是 niroyb 下面提到的类似方法吗?如果是这样,我想将其中之一标记为答案。谢谢!

标签: python arrays xml


【解决方案1】:

这是我的答案 - 我使用 lxml.html 来解析 HTML。使用正则表达式解析 HTML 通常是个坏主意(请参阅上面的@ivan_pozdeev 的回答)。

import lxml.html

sampleStr='<ul><li><a href="http://website/abc/vcd/HHD00300.JPG">HHD00300.JPG</a></li><li><a href="http://website/abc/vcd//HHD003002.jpg">HHD003002.jpg</a></li></ul>'
html = lxml.html.fromstring(sampleStr)
print html.xpath('//a/@href')

代码使用xpath 表达式检索字符串sampleStr 中所有a 标记中的所有href 属性。

样本输出:

['http://website/abc/vcd/HHD00300.JPG', 'http://website/abc/vcd//HHD003002.jpg']

【讨论】:

  • 是否仍然可以像数组一样访问html,例如...print html[0]会打印'website/abc/vcd//HHD003000.JPG'
  • 是的,您可以像这样存储表达式:href_list = html.xpath('//a/@href'),您现在有一个列表 href_list,您可以使用 href_list[0] 直接访问或访问它。
【解决方案2】:

您可以使用re.findall 方法。 它直接在一个列表中返回所有不重叠的正则表达式匹配。

print( re.findall("http://.*?\.JPG", imgsUrl) )

使用“.*?”在这种情况下,而不是“。*”很重要,因为可以有多个 url,所以你想要非贪婪匹配。

最好的方法是使用 xml 解析器。 对于 python,beautifulsoup 和 lxml 非常流行。

查看这些答案:

【讨论】:

【解决方案3】:

你可以使用BeautifulSoup来解析这个字符串。

from bs4 import BeautifulSoup
soup = BeautifulSoup(sampleStr)
links = soup.find_all("a")
output = []
for link in links:
    output.append(link["href"])

这是输出:

print(output)
>>> ['http://website/abc/vcd/HHD00300.JPG', 'http://website/abc/vcd//HHD003002.jpg']

【讨论】:

  • 谢谢,这个方法也适用于我的问题。不确定是否有更好的选择,但两者都可以,非常感谢!
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2018-08-25
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多