XPATH html有很多子对象

2021-10-17 14:11:24 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑页面变量中的html。你知道吗

如何访问tds?你知道吗

我想像xpath("/table/tr/td/text())"一样访问它们

我不想指出另一个trs

不幸的是,这个表达式xpath('.//table/tr/tr/tr/td/text()')也不起作用。你知道吗

Python代码:

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')

我要从根开始!你知道吗

3条回答
网友
1楼 ·

使用xpath //td/text()

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

//td代表“在任何深度中查找任何td元素”。你知道吗

对我有用。你知道吗

打印按table分组的td元素:

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

注意,在这种情况下,xpath中的.是有意义的。你知道吗

网友
2楼 ·

您不必将BeautifulSoup转换为str

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

你可以这样使用:

>>> 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>

或者,如果希望在元素中包含文本,也可以使用print(td.text)。你知道吗

网友
3楼 ·

tr内部的tr是无效的HTML。你知道吗

这似乎是由html.fromstring()解析器“修复”的。你知道吗

您可以使用以下xpath测试这一点:

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

并输出:

for thing in things:
   print(thing.tag)

产生:

td
td
td
td
td

相关问题