לדלג לתוכן

6.8 xml, xpath הרצאה

מה זה XML?

  • אז כמו ג'סון - XML זה דרך להעביר מידע / לשמור מידע בצורה קריאה יחסית, פשוט וקלה. אומנם זה שיטה קצת מיושנת ביחס JSON, ופחות משתמשים בה אבל היא ללא ספק נפוצה.

למה ללמוד על XML?

  • מאוד נפוץ בנקודות API באתרים.
  • מאוד נפוץ ופפולרי בהמון תוכנות.
    <library>
      <book genre="mystery">
        <title>Sherlock Holmes</title>
        <author>Arthur Conan Doyle</author>
        <price>15</price>
      </book>
    
      <book genre="fantasy">
        <title>The Hobbit</title>
        <author>J.R.R. Tolkien</author>
        <price>25</price>
      </book>
    
      <book genre="science-fiction">
        <title>Dune</title>
        <author>Frank Herbert</author>
        <price>30</price>
      </book>
    
      <book genre="mystery">
        <title>Murder on the Orient Express</title>
        <author>Agatha Christie</author>
        <price>18</price>
      </book>
    </library>
    
  • מאוד דומה לhtml
  • בזכות זה שזה מאוד דומה לhtml, כל תוכנה שיודעת לפרסר xml תדע גם לפרסר html - אז שימושי לדעת לעבוד עם xml.

מודול xml

  • מודול מובנה!
    import xml.etree.ElementTree as ET
    
    # XML string
    xml_data = '<person><name>John</name><age>30</age></person>'
    
    # Parse XML string
    root = ET.fromstring(xml_data)
    
    # Accessing elements
    name = root.find('name').text
    age = root.find('age').text
    
    print("Name:", name)
    print("Age:", age)
    
  • דומה מאוד לbs4, ואפשר להשתמש בזה כתחליף.

  • פירסור מקובץ xml

    import xml.etree.ElementTree as ET
    
    # Parse XML from a file
    tree = ET.parse('example.xml')
    root = tree.getroot()
    
    # Accessing elements
    for person in root.findall('person'):
        name = person.find('name').text
        age = person.find('age').text
        print("Name:", name)
        print("Age:", age)
    

שפה - XPATH

  • מהר מאוד XML ו- HTML יכולים לגדול ולהפוך להיות מאוד לא ברורים, כמו שראינו מקודם ואנחנו רוצים לפעמים למשל כמו בweb-scraping לשלוף מידע ספציפי מהXML.
  • כדי לעשות זאת בקלות אפשר להשתמש בשפת XPATH, שמשמשת אותנו בשליפות על קבצי XML/HTML

אז איך משתמשים בXPATH?

  • נלמד איך להשתמש באתר הבא: http://xpather.com/
  • דומה לקובץ XML (הכניסו אותו לאתר):
    <library>
      <book genre="mystery">
        <title>Sherlock Holmes</title>
        <author>Arthur Conan Doyle</author>
        <price>15</price>
      </book>
    
      <book genre="fantasy">
        <title>The Hobbit</title>
        <author>J.R.R. Tolkien</author>
        <price>25</price>
      </book>
    
      <book genre="science-fiction">
        <title>Dune</title>
        <author>Frank Herbert</author>
        <price>30</price>
      </book>
    
      <book genre="mystery">
        <title>Murder on the Orient Express</title>
        <author>Agatha Christie</author>
        <price>18</price>
      </book>
    </library>
    
  • עכשיו נרית את השאילתות XPATH הבאות באתר:
  • XPath: //title
  • XPath: //book[@genre='mystery']/author
  • XPath: //book[price>20]
  • XPath: //book[position()=1]
  • XPath: //book[last()]
  • XPath: //book[starts-with(title, 'The')]

טיפים אחרונים לXPATH

  • אז XPATH מסובך, הראתי רק דוגמאות פשוטות יחסית.
  • אם אתה רוצה ללמוד עוד על XPAH אתה מוזמן לחפש באינטרנט בעצמך.
  • תמיד תשתמש בסנד-בוקס כמו http://xpather.com/ כדי להרכיב את השאילתה שלך
  • הכלי XPATH מאוד שימושי בweb-scraping

המודול lxml

  • המודול מאפשר לנו להשתמש בxpath בפייתון!
  • הרץ pip install lxml
    from lxml import etree
    
    # Parse XML from a file
    tree = etree.parse('example.xml')
    
    # XPath expression to select all 'name' elements
    names = tree.xpath('//title')
    
    # Accessing elements
    for name in names:
        print("Name:", name.text)
    
  • תנאים עם xpath
    from lxml import etree
    
    # Parse XML from a file
    tree = etree.parse('example.xml')
    
    # XPath expression to select 'person' elements with age greater than 25
    persons = tree.xpath('//person[age > 25]')
    
    # Accessing elements
    for person in persons:
        name = person.find('name').text
        age = person.find('age').text
        print("Name:", name)
        print("Age:", age)