gpt4 book ai didi

python - 字符串变量作为 lxml.builder 中的 href

转载 作者:技术小花猫 更新时间:2023-10-29 12:34:12 26 4
gpt4 key购买 nike

我正在通过 lxml.builder 从列表中构建 HTML 表格,并努力在其中一个表格单元格中建立链接

列表是通过以下方式生成的:

with open('some_file.html', 'r') as f:
table = etree.parse(f)
p_list = list()
rows = table.iter('div')
p_list.append([c.text for c in rows])
rows = table.xpath("body/table")[0].findall("tr")
for row in rows[2:]:
p_list.append([c.text for c in row.getchildren()])

我解析的 HTML 文件相同由 lxml 进一步生成,即我设置了某种递归用于测试目的。

下面是我建表的方法

from lxml.builder import E

page = (
E.html(
E.head(
E.title("title")
),
E.body(
....

*[E.tr(
*[
E.td(E.a(E.img(src=str(col)))) if ind == 8 else
E.td(E.a(str(col), href=str(col))) if ind == 9 else
E.td(str(col)) for ind, col in enumerate(row)
]
) for row in p_list ]

当我通过文字指定链接时,一切正常。

E.td(E.a("link", href="url_address"))

但是,当我尝试将列表元素值(https://blahblahblah.com)作为链接输出时

E.td(E.a(str(col), href=str(col)))

单元格是空的,单元格中什么也没有显示。

如果我将链接文本指定为文字并输入 str (col)在 href 中,链接正常显示,但它包含的不是真正的 href,而是生成的 html 文件的名称

如果我只输出 col字符串形式的值

E.td(str(col))

正常显示,即不为空E.a有什么问题和 E.img元素?

刚刚注意到只有当我从 html 文件构建列表时才会发生这种情况。当我像这样手动构建列表时,所有输出都很好。

p_list = []
p_element = ['id']
p_element.append('value')
p_element.append('value2')
p_list.append(p_element)

当前输出(注意<a><href>标签)

   <html>
<head>
<title>page</title>
</head>
<body>
<style type="text/css">
th {
background-color: DeepSkyBlue;
text-align: center;
vertical-align: bottom;
height: 150px;
padding-bottom: 3px;
padding-left: 5px;
padding-right: 5px;
}
.vertical {
text-align: center;
vertical-align: middle;
width: 20px;
margin: 0px;
padding: 0px;
padding-left: 3px;
padding-right: 3px;
padding-top: 10px;
white-space: nowrap;
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
}</style>
<h1>title</h1>
<p>This is another paragraph, with a</p>
<table border="2">
<tr>
<th>
<div class="vertical">ID</div>
</th>
...
<th>
<div class="vertical">I blacklisted him</div>
</th>
</tr>
<tr>
<td>1020</td>
<td>&#1058;&#1072;&#1080;&#1089;&#1080;&#1103;&#1057;&#1090;&#1088;&#1072;&#1093;&#1086;&#1083;&#1077;&#1090;</td>
<td>No</td>
<td>Female</td>
<td>None</td>
<td>&#1057;&#1072;&#1085;&#1082;&#1090;-&#1055;&#1077;&#1090;&#1077;&#1088;&#1073;&#1091;&#1088;&#1075;</td>
<td>&#1056;&#1086;&#1089;i&#1103;</td>
<td>None</td>
<td>
<a>
<img src="&#10; "/>
</a>
</td>
<td>
<a href="&#10; ">
</a>
</td>
...
</tr>
</table>
</body>
</html>

期望的输出

<html>
<head>
<title>page</title>
</head>
<body>
<style type="text/css">
th {
background-color: DeepSkyBlue;
text-align: center;
vertical-align: bottom;
height: 150px;
padding-bottom: 3px;
padding-left: 5px;
padding-right: 5px;
}
.vertical {
text-align: center;
vertical-align: middle;
width: 20px;
margin: 0px;
padding: 0px;
padding-left: 3px;
padding-right: 3px;
padding-top: 10px;
white-space: nowrap;
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
}</style>
<h1>title</h1>
<p>This is another paragraph, with a</p>
<table border="2">
<tr>
<th>
<div class="vertical">ID</div>
</th>
...
<th>
<div class="vertical">I blacklisted him</div>
</th>
</tr>
<tr>
<td>1019</td>
<td>&#1052;&#1080;&#1093;&#1072;&#1080;&#1083;&#1055;&#1072;&#1074;&#1083;&#1086;&#1074;</td>
<td>No</td>
<td>Male</td>
<td>None</td>
<td>&#1057;&#1072;&#1085;&#1082;&#1090;-&#1055;&#1077;&#1090;&#1077;&#1088;&#1073;&#1091;&#1088;&#1075;</td>
<td>&#1056;&#1086;&#1089;i&#1103;</td>
<td>C.-&#1055;&#1077;&#1090;&#1077;&#1088;&#1073;&#1091;&#1088;&#1075;</td>
<td>
<a>
<img src="http://i.imgur.com/rejChZW.jpg"/>
</a>
</td>
<td>
<a href="http://i.imgur.com/rejChZW.jpg">link</a>
</td>
...
</tr>
</table>
</body>
</html>

最佳答案

我自己搞定了。问题不在于生成,而在于解析 HTML。解析函数未获取嵌套在 TD 中的 IMGA 标记,列表中的这些元素为空。由于程序的严格逻辑(从文件中获取 + 从站点 API 中获取),我无法检测到问题的原因。

正确的解析逻辑应该是:

for row in rows[1:]:
data.append([
c.find("a").text if c.find("a") is not None else
c.find("img").attrib['src'] if c.find("img") is not None else
c.text
for c in row.getchildren()
])

关于python - 字符串变量作为 lxml.builder 中的 href,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com