XPATH – html mit vielen Kindern

Betrachten Sie das html in der Seitenvariable.

Wie kann ich auf die td s zugreifen?

Ich möchte auf sie zugreifen wie xpath("/table/tr/td/text())"

Ich möchte nicht auf die anderen tr s

Leider xpath('.//table/tr/tr/tr/td/text()') dieser Ausdruck xpath('.//table/tr/tr/tr/td/text()') auch nicht.

Python-Code:

 import __future__ from lxml import html import requests from bs4 import BeautifulSoup page = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>cv</title> </head> <body> <table> <tr> <tr> <tr> <td>table1 td1</td> <td>table1 td2</td> </tr> </tr> </tr> </table> <table> <tr> <tr> <tr> <td>table2 td1</td> <td>table2 td2</td> </tr> </tr> </tr> </table> <table> <tr> <tr> <tr> <td>table3 td1</td> <td>table3 td2</td> </tr> </tr> </tr> </table> </body> </html> """ soup = str(BeautifulSoup(page, 'html.parser')) tree = html.fromstring(soup) things = tree.xpath('.//table/tr/tr/tr/td/text()') print(things) for thing in things: print(thing) print('That's all') 

Ich will es von der Wurzel!

  • Sortieren von XML-Dateien
  • Finden Sie ein Element in einem XML-Baum mit ElementTree
  • Wie bekomme ich den Titel von class attribute in XPath (Python / scrapy)
  • Wie passe ich den Inhalt eines Elements in XPath (lxml) an?
  • Erhalten Sie alle sichtbaren Text von einer Webseite mit Selen
  • Iterate durch alle Zeilen in einer Tabelle mit python lxml xpath
  • Wie kann ich diesen XPath-Ausdruck in BeautifulSoup übersetzen?
  • Wie man eine Variable in LXML XPath Expression verwendet
  • 3 Solutions collect form web for “XPATH – html mit vielen Kindern”

    Verwenden Sie xpath //td/text() :

     things = tree.xpath('//td/text()') 

    Die //td steht für "findet jedes td Element in jeder Tiefe.

    Funktioniert bei mir.

    Drucken td Elemente gruppiert pro table :

     doc = html.fromstring(page) for table_elm in doc.xpath("//table"): print "another table" things = table_elm.xpath('.//td/text()') print(things) 

    Beachten Sie, dass in diesem Fall die . In xpath signifikant

    Du musst dich nicht zu schneiden:

     soup = str(BeautifulSoup(page, 'html.parser')) 

    Du kannst so etwas verwenden:

     >>> soup = BeautifulSoup(page, 'html.parser') >>> for td in soup.find_all('td'): ... print(td) ... <td>table1 td1</td> <td>table1 td2</td> <td>table2 td1</td> <td>table2 td2</td> <td>table3 td1</td> <td>table3 td2</td> 

    Oder du kannst auch print(td.text) wenn du den Text innerhalb des Elements willst.

    tr innerhalb von tr ist ungültig HTML.

    Und das scheint von dem html.fromstring() Parser "fixiert" zu werden.

    Sie können dies mit diesem xpath testen:

     things = tree.xpath('//table/tr/*') 

    Und Ausgabe mit:

     for thing in things: print(thing.tag) 

    Was erzeugt:

     td td td td td 
    Python ist die beste Programmiersprache der Welt.