buduję tabeli HTML z listy poprzez lxml.builder i dążąc do łącza w jednej z komórek tabelizmienna String jako href w lxml.builder
Lista generowana jest w sposób następujący:
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()])
plik HTML, który I analizować to samo, który jest generowany przez lxml dalej, czyli skonfigurować jakiś rekursji dla celów testowych.
A oto jak zbudować tabelę
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 ]
Kiedy podać link, za pomocą literałów wszystko idzie dobrze.
E.td(E.a("link", href="url_address"))
Jednak, gdy staram się lista wyjściowa wartość elementu (co jest https://blahblahblah.com
) jako link
E.td(E.a(str(col), href=str(col)))
komórka jest pusta, po prostu nic nie pokazał w komórce.
Gdybym określić tekst link jako dosłowne i umieścić str (col)
do href, link jest pokazały normalnie, ale zamiast rzeczywistej href zawiera nazwę wygenerowanego pliku html.
Jeżeli wyjście po prostu, że wartość col
jako ciąg
E.td(str(col))
ona pokazała normalnie, to znaczy nie jest pusty. Co jest nie tak z elementami i E.img
?
Po prostu zauważyłem, że tak się dzieje tylko wtedy, gdy buduję listę z pliku html. Kiedy ręcznie buduję listę, tak jak to wszystko, wszystko jest w porządku.
p_list = []
p_element = ['id']
p_element.append('value')
p_element.append('value2')
p_list.append(p_element)
Wyjście prądowe (zwrócić uwagę <a>
i <href>
znaczników)
<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>ТаисияСтрахолет</td>
<td>No</td>
<td>Female</td>
<td>None</td>
<td>Санкт-Петербург</td>
<td>Росiя</td>
<td>None</td>
<td>
<a>
<img src=" "/>
</a>
</td>
<td>
<a href=" ">
</a>
</td>
...
</tr>
</table>
</body>
</html>
Pożądany wyjście
<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>МихаилПавлов</td>
<td>No</td>
<td>Male</td>
<td>None</td>
<td>Санкт-Петербург</td>
<td>Росiя</td>
<td>C.-Петербург</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>
@mzjn, tworząc listę dodany kod – Suncatcher
To 'p_list'.Poprawiono vans – Suncatcher
@ czysty HTML. Generowane dokładnie z tym samym builderem ElementTree. – Suncatcher