【问题标题】:XML parsing - findall() list comes up emptyXML 解析 - findall() 列表为空
【发布时间】:2020-11-16 20:49:13
【问题描述】:

卡在处理 URL 和 XML 解析的任务上。我已经得到了数据,但似乎无法让 findall() 工作。我知道一旦我可以让 findall() 工作,我就会有一个可以循环访问的列表。任何见解都会很棒,如果可能的话,希望能得到温和的推动而不是直接的答案。谢谢!

import urllib.request, urllib.parse, urllib.error
import xml.etree.ElementTree as ET
fhand = urllib.request.urlopen('http://py4e-data.dr-chuck.net/comments_42.xml')

raw_data = fhand.read().decode()
xml_data = ET.fromstring(raw_data)
lst = xml_data.findall('name')
print(lst)

【问题讨论】:

    标签: python xml-parsing url-parsing


    【解决方案1】:

    findall 不是递归的,这意味着如果它不在您调用findall 的元素的正下方(即如果不使用 xpath),它将找不到节点/元素。

    改为使用iter:

    import urllib.request
    import xml.etree.ElementTree as ET
    
    fhand = urllib.request.urlopen('http://py4e-data.dr-chuck.net/comments_42.xml')
    
    raw_data = fhand.read().decode()
    xml_data = ET.fromstring(raw_data)
    for name_node in xml_data.iter('name'):
        print(name_node.text)
    

    findallxpath

    xml_data.findall('comments/comment/name')
    

    两者都会输出

    Romina
    Laurie
    Bayli
    Siyona
    Taisha
    Alanda
    Ameelia
    Prasheeta
    Asif
    Risa
    Zi
    Danyil
    Ediomi
    Barry
    Lance
    Hattie
    Mathu
    Bowie
    Samara
    Uchenna
    Shauni
    Georgia
    Rivan
    Kenan
    Hassan
    Isma
    Samanthalee
    Alexa
    Caine
    Grady
    Anne
    Rihan
    Alexei
    Indie
    Rhuairidh
    Annoushka
    Kenzi
    Shahd
    Irvine
    Carys
    Skye
    Atiya
    Rohan
    Nuala
    Maram
    Carlo
    Japleen
    Breeanna
    Zaaine
    Inika
    

    【讨论】:

    • 谢谢!可以说我确实想使用 findall ,我该怎么做?我尝试了不同的东西,比如 findall('comment/name) , findall('cmets/comment/name) 等
    • @GBH 您实际上可以使用xml_data.findall('comments/comment/name'),我会将其添加到我的答案中
    • 刚刚尝试过,它确实有效,我也可以分出名称进行计数。非常感谢!
    【解决方案2】:

    您可以为此使用 requests 库和 BeautifulSoup:

    import requests
    from bs4 import BeautifulSoup
    
    response = requests.get('http://py4e-data.dr-chuck.net/comments_42.xml')
    
    soup = BeautifulSoup(response.text, 'html.parser')
    names = soup.find_all('name')
    for name in names:
        print(name.text)
    

    输出:

    Romina
    Laurie
    Bayli
    Siyona
    Taisha
    Alanda
    Ameelia
    Prasheeta
    Asif
    Risa
    Zi
    Danyil
    Ediomi
    Barry
    Lance
    Hattie
    Mathu
    Bowie
    Samara
    Uchenna
    Shauni
    Georgia
    Rivan
    Kenan
    Hassan
    Isma
    Samanthalee
    Alexa
    Caine
    Grady
    Anne
    Rihan
    Alexei
    Indie
    Rhuairidh
    Annoushka
    Kenzi
    Shahd
    Irvine
    Carys
    Skye
    Atiya
    Rohan
    Nuala
    Maram
    Carlo
    Japleen
    Breeanna
    Zaaine
    Inika
    

    【讨论】:

    • 这与你使用urllib还是requests获取数据无关。关于beautifulsoup 的部分是部分正确的,具体到 xml 和 html 之间的细微差别。
    • 同意你可以使用urllibrequests,我只是提供了一个替代方案,如果你开始网络抓取,我认为请求和BeautifulSoup 库更容易使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2021-08-05
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多